使用Powershell比较部分节点xml文件

时间:2019-07-04 13:47:40

标签: xml powershell compare

我想比较两个文件(GPO-> GPOReport中的计算机)的xml树的一部分。

texture

提供与文件的完全不同之处。但是我只想要节点的一部分。

2 个答案:

答案 0 :(得分:1)

比较树(即XML文档)要比比较两个列表(如两个文件中的行)要复杂一些。

从您的问题中尚不清楚您要在此处进行比较的范围,但是如果您只想测试两个XML文档之间的单个值或属性,最简单的方法可能是使用Select-Xml:< / p>

$xml1 = [xml]@'
<root>
  <nodegroup>
    <node name="myNode">SomeValue</node>
  </nodegroup>
</root>
'@
$xml2 = [xml]@'
<root>
  <nodegroup>
    <node name="myNode">SomeOtherValue</node>
  </nodegroup>
</root>
'@

$res1,$res2 = $xml1,$xml2 |Select-Xml -XPath 'root/nodegroup/node[@name = "myNode"]'

if($res1.Node.InnerText -eq $res2.Node.InnerText){
    # the inner text value of the selected node is the same in both documents
}

答案 1 :(得分:0)

$xml1 = Get-Content -Path "D:\gpo-test\gpo-original.xml"
$xml2 = Get-Content -Path "D:\gpo-test\gpo.xml"

#$XmlActive.GetType().FullName
$res1,$res2 = $xml1,$xml2 |Select-Xml -XPath '//gpo/computer'

if($res1.Node.InnerText -eq $res2.Node.InnerText){
    # the inner text value of the selected node is the same in both documents
}

xml结构是这样的:

<GPO xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.microsoft.com/GroupPolicy/Settings">
  <Computer>
   ...
  </Computer>

我得到了错误

Select-Xml : Cannot validate argument on parameter 'Content'. The argument is null or empty. Provide an argument that
is not null or empty, and then try the command again.
At D:\gpo-test\compare.ps1:15 char:28
+ $res1,$res2 = $xml1,$xml2 |Select-Xml -XPath '//gpo/computer'
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (System.Object[]:Object[]) [Select-Xml], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Microsoft.PowerShell.Commands.SelectXmlCommand

我想要完整的树,并将其与另一个文件中的树进行比较。