Reputation: 7471
I'm trying to create a child XML element for this xml:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
</configuration>
I use this PowerShell script:
[xml] $doc = Get-Content($filePath)
$child = $doc.CreateElement("newElement")
$doc.configuration.AppendChild($child)
I have an error: Method invocation failed because [System.String] doesn't contain a method named 'AppendChild'.
Upvotes: 56
Views: 119179
Reputation: 338376
If you use dot notation to navigate an XML file (e.g. $doc.configuration
), Powershell tries to be clever about what it returns.
String
.XmlElement
.Object[]
, where each individual array element is again subject to these rules, e.g. it will either be a String
or an XmlElement
depending on its contents.$null
.In your case it's easy since you want to append nodes to the document element:
$doc = New-Object System.Xml.XmlDocument
$doc.Load($filePath)
$child = $doc.CreateElement("newElement")
$doc.DocumentElement.AppendChild($child)
but you could use $doc.SelectNodes()
or $doc.SelectSingleNode()
to navigate around the XML document and always have a node/node list returned.
One could argue about the sensibility of this behavior, but as a matter of fact it makes consuming (sanely structured) XML quite straight-forward - for example tasks such as reading values from a config file, or from an API response. That's the purpose of this simple syntax.
It's not a good tool for creating XML, which is a more complex task. Using DOM API methods from the start is the better approach here.
Upvotes: 90