我正在使用powershell构建一个比较引擎脚本,我需要能够比较的其中一个是xml文件。当我使用原生powershell比较对象时,如果我抓住outerxml(文本表示)和差异我会得到差异,它返回0差异。不幸的是,这会将所有内容放在一个长字符串中,所以没用。
然后我尝试使用来自microsoft的XmlDiffPatch库,但是如果我使用示例程序或powershell中的库,我的2 xml文件会失败并出现异常:
$d.Compare("c:\scripts\ps\ref.xml", "c:\scripts\ps\tgt.xml", $false)
Exception calling "Compare" with "3" argument(s): "Length cannot be less than zero.
Parameter name: length"
At line:1 char:1
+ $d.Compare("c:\scripts\ps\ref.xml", "c:\scripts\ps\tgt.xml", $false)
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : ArgumentOutOfRangeException
如果不访问此库的源代码,我不知道除了bug之外还有什么。 IE中的2 xml解析很好,所以我知道它们是有效的xml。
之前有其他人见过吗?你是怎么解决的?
答案 0 :(得分:1)
看起来像XMLDiffPatch库的方法Microsoft.XmlDiffPatch.XmlDiff.NormalizeText(String text)
中有一个错误,该错误无法处理纯空白字符串(" "
)。如果传递一个,则该方法尝试实例化一个负长度的string
,因此是异常。
我正在比较一些XML,其中包含诸如AttributeName=" "
之类的属性,当库试图对其进行规范化时,它们会导致这些异常。我瞥了一眼XML spec,并且不禁止这样的属性。
结果证明它无法修复,也没有好的解决方法(除了在比较之前“修复” XML)。我最终改用XmlUnit.Net库。
答案 1 :(得分:0)
这是我使用它的一种方式,也是想要发现它的人的完整示例:
# Test-xmldiffpatch.ps1
# This code need to download Microsoft tool
# https://msdn.microsoft.com/en-us/library/aa302294
# or Nuget
# https://www.nuget.org/packages/XMLDiffPatch/
# Load the external DLL
Add-Type -Path "C:\Program Files (x86)\XmlDiffPatch\Bin\xmldiffpatch.dll"
$xmlD1=[XML](Get-Content 'd:\temp\M1.xml')
$xmlD2=[XML](Get-Content 'd:\temp\M2.xml')
$xmlWriter = [System.Xml.XmlWriter]::Create("d:\temp\M3.xml")
$xmlDiff= New-Object Microsoft.XmlDiffPatch.XmlDiff
$xmlDiff.IgnorePrefixes=$true
$xmlDiff.IgnoreChildOrder=$true
$xmlDiff.IgnoreNamespaces=$true
$blIdentical = $xmldiff.Compare($xmlD1, $xmlD2, $xmlWriter);
$blIdentical
$xmlWriter.Close();
M1.xml
和M2.xml
是两个相似或不同的XML文件M3.xml
将收到增量。
答案 2 :(得分:0)
对于遇到这个(像我一样)XmlDiffPatch 源以及此问题的修复程序的人,可在此处获得:- https://github.com/shadolight/XmlDiffPatch
不是我的 repo,只是在寻找相同的解决方案。