I have this XML-file with this structure:
<?xml version="1.0" encoding="utf-8"?>
<company>
<category>
<category1 name="Office1">
<category2 name="Project1">
<category3 name="Test1"/>
<category3 name="Test2"/>
</category2>
<category2 name="Project2">
<category3 name="Test1"/>
<category3 name="Test2"/>
<category3 name="Test3"/>
</category2>
</category1>
<category1 name="Office2">
<category2 name="Project1">
<category3 name="Test1"/>
<category3 name="Test2"/>
</category2>
<category2 name="Project2">
<category3 name="Test1"/>
<category3 name="Test2"/>
<category3 name="Test3"/>
</category2>
</category1>
</category>
</company>
I want to add a line to company -> category -> category1 "Office2" -> category2 "Project2" The line is:
<category3 name="Test4"/>
I've tried this:
$Path = "C:\file.xml"
$xml = [xml](get-content $Path)
$xml.Load($Path)
$test = $xml.company.category
$test.category1 *what to do here*
I know how to do this with one sub-element, and how to clone and add. But I don't know where to start with this one.
Get the element node and use SetAttribute to add an attribute to the attribute collection of that element. Create an XmlAttribute node using the CreateAttribute method, get the element node, then use SetAttributeNode to add the node to the attribute collection of that element.
The XML attribute is a part of an XML element. The addition of attribute in XML element gives more precise properties of the element i.e, it enhances the properties of the XML element. In the above syntax element_name is the name of an element which can be any name.
Attributes are part of XML elements. An element can have multiple unique attributes. Attribute gives more information about XML elements. To be more precise, they define properties of elements. An XML attribute is always a name-value pair.
Add a new attribute to the element, using setAttribute(String name, String value) . Call void prettyPrint(Document xml) method of the example. The method gets the xml Document and converts it into a formatted xml String, after transforming it with specific parameters, such as encoding.
Don't know if there is a shorter way, but this should work:
$Path = "C:\file.xml"
$xml = [xml](get-content $Path)
$xml.Load($Path)
$target = (($xml.company.category.category1|where {$_.name -eq "Office2"}).category2|where {$_.name -eq "Project2"})
$addElem = $xml.CreateElement("Category3")
$addAtt = $xml.CreateAttribute("name")
$addAtt.Value = "Test4"
$addElem.Attributes.Append($addAtt)
$target.AppendChild($addElem)
$xml.Save("C:\file1.xml")
The main points here are the usage of where
to get the elements with the given attribute values and the creation of a new element and a new attribute.
Another possible solution to get the "target" element is the usage of XPath:
$target = $xml.SelectSingleNode('//company/category/category1[@name="Office2"]/category2[@name="Project2"]')
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With