【问题标题】:XmlDiffPatch raises exception Length cannot be less than zeroXmlDiffPatch 引发异常长度不能小于零
【发布时间】:2015-07-06 03:22:09
【问题描述】:

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

然后我尝试使用 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

没有访问这个库的源代码,我不知道除了错误之外发生了什么。这 2 个 XML 在 IE 中的解析很好,所以我知道它们是有效的 XML。

有没有其他人见过这个?你是怎么解决的?

【问题讨论】:

  • 抱歉,$d 是 XmlDiffPatch 类的实例化,错过了输入中的那一行。
  • 我错过了您的评论,我会尝试一下,最后我编写了自己的 xml 差异解析器。它为 xml 文档中的每个元素创建一个 xpath,然后使用 PS 内置比较来检查每个元素并区分每个元素的属性。我还创建了一个 XSL,它将一个“diff”对象(转换为 xml)转换为一个漂亮的 html 页面,该页面突出显示正在比较的各种对象中的增量。

标签: c# xml powershell xmldiff


【解决方案1】:

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

# 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.xmlM2.xml 是两个相似或不同的XML 文件M3.xml 将接收增量。

【讨论】:

    【解决方案2】:

    看起来 XMLDiffPatch 库在其方法 Microsoft.XmlDiffPatch.XmlDiff.NormalizeText(String text) 中有一个错误,它无法处理纯空格字符串 (" ")。如果您传递一个,该方法会尝试实例化一个负长度的string,因此会出现异常。

    我正在比较的一些 XML 包含像 AttributeName=" " 这样的属性,当库试图对其进行规范化时,它们会导致这些异常。我扫了一眼XML spec,这样的属性是不被禁止的。

    事实证明它无法修复,并且没有好的解决方法(除了在比较之前“修复”XML)。我最终改用 XmlUnit.Net 库。

    【讨论】:

    • 我最终放弃了这种方法,但很高兴知道其他人遇到了这种情况。我最终在 powersell 中编写了自己的 xml 差异脚本,并将在本周晚些时候尝试发布。
    【解决方案3】:

    对于遇到此(像我一样)XmlDiffPatch 源以及此问题的修复程序的人,可在此处获得:-https://github.com/shadolight/XmlDiffPatch

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多