Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# XmlDiffPatch引发异常长度不能小于零_C#_Xml_Powershell_Xmldiff - Fatal编程技术网

C# XmlDiffPatch引发异常长度不能小于零

C# XmlDiffPatch引发异常长度不能小于零,c#,xml,powershell,xmldiff,C#,Xml,Powershell,Xmldiff,我正在PowerShell中构建一个比较引擎脚本,我需要能够比较的东西之一是XML文件。当我使用本机PowerShell compare对象时,它返回0个差异,但是如果我获取outerxml(文本表示)和diff,我确实会得到差异。不幸的是,这将所有内容放在一个长字符串中,因此没有用处 然后,我尝试使用Microsoft的XmlDiffPatch库,但是如果我使用示例程序或PowerShell中的库,我的2个XML文件将失败,出现以下异常: $d.Compare("c:\scripts\ps\r

我正在PowerShell中构建一个比较引擎脚本,我需要能够比较的东西之一是XML文件。当我使用本机PowerShell compare对象时,它返回0个差异,但是如果我获取outerxml(文本表示)和diff,我确实会得到差异。不幸的是,这将所有内容放在一个长字符串中,因此没有用处

然后,我尝试使用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之外,我不知道发生了什么。这两个XML在IE中的解析很好,所以我知道它们是有效的XML


以前有人见过这个吗?你是怎么解决的

这是我使用它的一种方式,也是希望发现它的人的一个完整示例:

# 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
将接收增量。

看起来XMLDiffPatch库的方法
Microsoft.XMLDiffPatch.XmlDiff.NormalizeText(字符串文本)
,它不能处理只有空格的字符串(
)。如果传递一个,该方法将尝试实例化长度为负的
字符串,因此出现异常

我比较了一些XML中包含的属性,如
AttributeName=“
”,当库试图对它们进行规范化时,它们导致了这些异常。我浏览了一下,像这样的属性是不被禁止的


事实证明,它是无法修复的,而且也没有好的解决方法(除了在比较之前“修复”XML)。最后我改用了library。

对于遇到(像我一样)XmlDiffPatch源代码以及此问题的修复程序的人,请访问:


不是我的repo只是在寻找相同的解决方案。

对不起,$d是XmlDiffPatch类的实例化,输入中没有这一行。我没有听到你的评论,我将尝试一下,最后我编写了自己的xml diff解析器。它为xml文档中的每个元素创建一个xpath,然后使用PS内置的compare来检查每个元素并区分每个元素的属性。我还创建了一个XSL,它将一个“diff”对象(转换成xml)转换成一个漂亮的html页面,突出显示所比较的各种对象中的增量。我最终放弃了这种方法,但很高兴知道有人遇到了这种情况。我最终在powersell中编写了自己的XMLDiff脚本,并将在本周晚些时候发布。