将XML文档合并到空XML节点中?

编辑 :这与链接的发布不完全相同。 我遇到的主要问题是将子节点附加到空XML节点。 直接选择节点时,它将返回System.String类型,该类型没有AppendChild方法。 修复是选择所有子节点,然后根据Dan的建议按名称过滤它。

 $emptyNode= $root.ChildNodes | ? { $_.name -eq "customers" } 

我主要使用的是powershell,但是我正在使用的很多代码下面都使用的是.NET System对象。 我想要做的事情可能更好地通过一个例子来解释。 假设我有三个XML文档:

   ACME Co   Alex 20   Aaron 21   Allison 22    

   Big Co   Bob 30   Barry 31   Bill 32    

   Cool Co   Carl 40   Craig 41   Chris 42    

我有一个“根”文档,看起来像:

    

我想在根文档下合并三个A,B和C文档,这样我的最终产品将是:

     ACME   Alex 20   Aaron 21   Allison 22      Big Co   Bob 30   Barry 31   Bill 32      Cool Co   Carl 40   Craig 41   Chris 42     

我一直在寻找AppendChild和ImportNode,但我一直在收到各种错误。 有一件事,就是在我的根文档中,单个空节点customers列出了一种System.String而不是XmlNode,所以我不能追加任何子节点。 请参阅此Powershell代码段:

 $doc = New-Object System.Xml.XmlDocument $doc.LoadXml("") $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("ACMEAlex20Aaron21Allison22") $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 

任何帮助将不胜感激。 谢谢!

首先通过执行以下操作获取客户节点:

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

现在,您可以使用文档A,B和C在$ customersNode上调用AppendChild。

但是要导入文档A,B和C,你几乎是正确的。 使用DocumentElement属性,如下所示:

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

如果需要使用XML树中的节点,我建议通过SelectSingleNode()SelectNodes()和XPath表达式选择节点:

 [xml]$doc = "" $root = $doc.SelectSingleNode('/customers') 

然后,您可以导入并附加其他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')