編輯:這與鏈接的發佈不完全相同。我遇到的主要問題是將子節點添加到空的XML節點。直接選擇節點時,它將返回一個System.String
類型,該類型沒有AppendChild
方法。解決方法是選擇所有的子節點,然後按照Dan的建議在下面按名稱過濾。將XML文檔合併到空的XML節點中?
$emptyNode= $root.ChildNodes | ? { $_.name -eq "customers" }
我主要使用PowerShell,但很多代碼的下面我和使用.NET系統對象的工作。我想要做的是通過一個例子來解釋。說我有三個XML文件:
<!-- XML File A -->
<customer>
<name>ACME Co</name>
<users>
<user>
<name>Alex</name>
<age>20</age>
</user>
<user>
<name>Aaron</name>
<age>21</age>
</user>
<user>
<name>Allison</name>
<age>22</age>
</user>
</users>
</customer>
和
<!-- XML File B -->
<customer>
<name>Big Co</name>
<users>
<user>
<name>Bob</name>
<age>30</age>
</user>
<user>
<name>Barry</name>
<age>31</age>
</user>
<user>
<name>Bill</name>
<age>32</age>
</user>
</users>
</customer>
和
<!-- XML File C -->
<customer>
<name>Cool Co</name>
<users>
<user>
<name>Carl</name>
<age>40</age>
</user>
<user>
<name>Craig</name>
<age>41</age>
</user>
<user>
<name>Chris</name>
<age>42</age>
</user>
</users>
</customer>
我有一個 「根」 的文件,看起來像:
<?xml version='1.0' encoding='utf-8' ?>
<customers>
</customers>
我想將三個A,B和C文件結合起來的nDer根文檔,這樣我的最終產品將是:
<?xml version='1.0' encoding='utf-8' ?>
<customers>
<!-- XML File A -->
<customer>
<name>ACME</name>
<users>
<user>
<name>Alex</name>
<age>20</age>
</user>
<user>
<name>Aaron</name>
<age>21</age>
</user>
<user>
<name>Allison</name>
<age>22</age>
</user>
</users>
</customer>
<!-- XML File B -->
<customer>
<name>Big Co</name>
<users>
<user>
<name>Bob</name>
<age>30</age>
</user>
<user>
<name>Barry</name>
<age>31</age>
</user>
<user>
<name>Bill</name>
<age>32</age>
</user>
</users>
</customer>
<!-- XML File C -->
<customer>
<name>Cool Co</name>
<users>
<user>
<name>Carl</name>
<age>40</age>
</user>
<user>
<name>Craig</name>
<age>41</age>
</user>
<user>
<name>Chris</name>
<age>42</age>
</user>
</users>
</customer>
</customers>
我一直在尋找的appendChild和ImportNode,但我不斷收到各種錯誤。有一件事是,在我的根文檔中,單個空節點customers
被列爲System.String類型而不是XmlNode,所以我不能附加任何子節點。看到這個PowerShell的片段:
$doc = New-Object System.Xml.XmlDocument
$doc.LoadXml("<?xml version='1.0' encoding='utf-8' ?><customers></customers>")
$doc.customers.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
甚至不管那麼多了,雖然,因爲如果我嘗試導入的節點,我得到一個錯誤Cannot import nodes of type 'Document'.
。
$docA = New-Object System.Xml.XmlDocument
$docA.LoadXml("<customer><name>ACME</name><users><user><name>Alex</name><age>20</age></user><user><name>Aaron</name><age>21</age></user><user><name>Allison</name><age>22</age></user></users></customer>")
$docAImported = $doc.ImportNode($docA, $true)
Exception calling "ImportNode" with "2" argument(s): "Cannot import nodes of type 'Document'."
At line:1 char:32
+ $docAImported = $doc.ImportNode <<<< ($docA, $true)
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
任何幫助將不勝感激。謝謝!
謝謝,'$ doc.ChildNodes | ? {$ _。name -eq「customers」}'部分是我所需要的。我給出的例子並不完全是我正在使用的XML的一對一,但它足以解決問題。 – romellem