【问题标题】:Compare XML file (attributes, nodes and text)比较 XML 文件(属性、节点和文本)
【发布时间】:2018-09-14 12:08:55
【问题描述】:

我知道已经有几个关于这个主题的问题,但似乎没有一个解决方案适合我。我已经尝试过名称中包含 Diff 的所有内容、XMLUnit、FatAntelope、xdocument 等等。 这些方法的主要问题是,我要么没有得到我想要的输出,要么根本没有输出。最好的方法是使用以下代码的 XmlDiffLib:

var exampleA = File.ReadAllText(@"Error0.xml");
var exampleB = File.ReadAllText(@"Error1.xml");

var diff = new XmlDiff(exampleA, exampleB);

diff.CompareDocuments(new XmlDiffOptions());

Console.WriteLine(diff.ToString());
Console.ReadLine();

但它只显示我更改的文本(例如<error>TextThatCanBeDetected</error>)。我还想检查更改的属性 (<error same="IWantToCheckThisToo"/>)

内联编辑 diff 也有其他缺陷,例如,如果在新 XML 中是一个额外的标签,它将不会被识别为一个 结束内联编辑

我很乐意帮助我解决这个问题,下面是 XML 文件的示例

<?xml version="1.0" encoding="UTF-8"?>
<message>
<header>
</header>
<body>
    <error name="MyName"> MyInnerXML </error>
</body>
</message>

(请注意,原始文件长约 100 行)

编辑

所以一个答案是将 CompareDocuments 方法更改为

diff.CompareDocuments(new XmlDiffOptions { IgnoreAttributes=false });

但输出是

(我使用了 wudri 和 hudri 作为名称标签,它告诉我没有找到 wudri 但没有关于 hudri)

【问题讨论】:

    标签: c# xml


    【解决方案1】:

    只需指定不忽略 XmlDiffOptions 中的属性:

    diff.CompareDocuments(new XmlDiffOptions { IgnoreAttributes = false });
    

    此外,您需要指定比较两个方向以识别不同节点的两个值:

    diff.CompareDocuments(new XmlDiffOptions { IgnoreAttributes = false, TwoWayMatch = true });
    

    【讨论】:

    • 好吧,这并没有做任何事情
    • 我用您的样本 Xml 进行了测试,它清楚地确定了 name="MyName1"name="MyName2" 之间的区别。
    • 添加 TwoWayMatch = trueoption 应该会给你想要的结果,识别不同节点的两个值。
    • 基本上它工作。输出很难阅读,但所需的输出就在那里。问题:它不适用于我的问题中提到的 100 多行。甚至 XmlDiffLib 的开发人员也将其视为他在 github 上的代码的问题
    猜你喜欢
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-03
    • 1970-01-01
    相关资源
    最近更新 更多