I'm using xmlstarlet to make some modifications to an xml file (lets call it test.xml), but I'm running into issues with my update statement (Note: I'm very new to xmlstarlet as well!).
Here is an example of the xml I'm working with:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<LIST>
<STUFF>
<xSTUFF>
<ITEM>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Item_ID</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>X-123</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Color</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>Purple</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<VULN_ATTRIBUTE>Weight</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>5</ATTRIBUTE_DATA>
</ITEM_DATA>
<INSTOCK>No</INSTOCK>
<LOCATION></LOCATION>
<PRICE></PRICE>
<ONSALE></ONSALE>
<DISCOUNT></DISCOUNT>
</ITEM>
<ITEM>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Item_ID</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>X-124</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Color</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>Red</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<VULN_ATTRIBUTE>Weight</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>3</ATTRIBUTE_DATA>
</ITEM_DATA>
<INSTOCK>Yes</INSTOCK>
<LOCATION>IsleA</LOCATION>
<PRICE>2.99</PRICE>
<ONSALE>No</ONSALE>
<DISCOUNT>No</DISCOUNT>
</ITEM>
</xSTUFF>
</STUFF>
</LIST>
There are multiple items, each with unique item IDs. I'm trying to update the INSTOCK, LOCATION, PRICE, and sometimes the ONSALE and DISCOUNT fields for a given item ID. Using one of those as an example, I'm trying the following:
xmlstarlet ed --inplace -u "//LIST/STUFF/xSTUFF/ITEM/ITEM_DATA[ATTRIBUTE_DATA='X-123']/../INSTOCK" -v Yes test.xml
This appears to work, but for some reason strips the leading element tags on everything below within the matching item element, so my output file ends up looking like this (note the missing LOCATION, PRICE, ONSALE, and DISCOUNT leading tags):
*** EDIT: Tags were actually reformatted to self-closing tags, results below updated. Thanks Daniel Haley.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<LIST>
<STUFF>
<xSTUFF>
<ITEM>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Item_ID</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>X-123</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Color</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>Purple</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<VULN_ATTRIBUTE>Weight</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>5</ATTRIBUTE_DATA>
</ITEM_DATA>
<INSTOCK>Yes</INSTOCK>
<LOCATION/>
<PRICE/>
<ONSALE/>
<DISCOUNT/>
</ITEM>
<ITEM>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Item_ID</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>X-124</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<ITEM_ATTRIBUTE>Color</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>Red</ATTRIBUTE_DATA>
</ITEM_DATA>
<ITEM_DATA>
<VULN_ATTRIBUTE>Weight</ITEM_ATTRIBUTE>
<ATTRIBUTE_DATA>3</ATTRIBUTE_DATA>
</ITEM_DATA>
<INSTOCK>Yes</INSTOCK>
<LOCATION>IsleA</LOCATION>
<PRICE>2.99</PRICE>
<ONSALE>No</ONSALE>
<DISCOUNT>No</DISCOUNT>
</ITEM>
</xSTUFF>
</STUFF>
</LIST>
I'm guessing I'm missing something simple since I'm completely green to xmlstarlet, so any help is greatly appreciated!
<LOCATION/>
. This is the equivalent of<LOCATION></LOCATION>
. (See stackoverflow.com/q/21022367/317052 .) I don't think you can control that part of the serialization in xmlstarlet. – Daniel Haley<?xml ...?>
) and indent (pretty print) doesn't seem to work. (Tested with xmlstartlet 1.6.1 on Windows.) Let me know if you'd like an example and I'll add an answer. – Daniel Haley