2015-06-12 113 views
0

編輯:這與鏈接的發佈不完全相同。我遇到的主要問題是將子節點添加到空的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 

任何幫助將不勝感激。謝謝!

回答

2

做第一個獲取客戶端節點如下:

$customersNode = $doc.ChildNodes | ? { $_.name -eq "customers" } 

現在你可以調用的appendChild在$ customersNode文件A,B和C

但是導入文件A,B和C你幾乎沒有錯。使用documentElement屬性象下面這樣:

$docAImported = $doc.ImportNode($docA.DocumentElement, $true) 
+0

謝謝,'$ doc.ChildNodes | ? {$ _。name -eq「customers」}'部分是我所需要的。我給出的例子並不完全是我正在使用的XML的一對一,但它足以解決問題。 – romellem

3

如果你需要從XML樹節點工作,我建議你通過SelectSingleNode()SelectNodes()選擇節點(S)和XPath expression

[xml]$doc = "<?xml version='1.0' encoding='utf-8' ?><customers></customers>" 
$root = $doc.SelectSingleNode('/customers') 

然後你可以importappend從您的其他XML文件是這樣的節點:

Get-ChildItem '*.xml' | % { 
    [xml]$xml = Get-Content $_.FullName 
    $node = $xml.SelectSingleNode('/customer') 
    $importedNode = $doc.ImportNode($node, $true) 
    $root.AppendChild($importedNode) 
} 

$doc.Save('C:\path\to\customers.xml') 
相關問題