Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.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# 比较XML文件(属性、节点和文本)_C#_Xml - Fatal编程技术网

C# 比较XML文件(属性、节点和文本)

C# 比较XML文件(属性、节点和文本),c#,xml,C#,Xml,我知道关于这个话题已经有好几个问题了,但是没有一个解决方案适合我。我已经用Diff在名称、XMLUnit、FatAntelope、xdocument等方面尝试了一切。 这些方法的主要问题是,我要么没有得到想要的输出,要么根本没有输出。最好的方法是XmlDiffLib,代码如下: var exampleA = File.ReadAllText(@"Error0.xml"); var exampleB = File.ReadAllText(@"Error1.xml"); var diff = ne

我知道关于这个话题已经有好几个问题了,但是没有一个解决方案适合我。我已经用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();
但它只显示已更改的文本(即可检测的文本)。我需要额外检查更改的属性(

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

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

<?xml version="1.0" encoding="UTF-8"?>
<message>
<header>
</header>
<body>
    <error name="MyName"> MyInnerXML </error>
</body>
</message>
但产出是有限的


(我使用wudri和hudri作为名称标记,它告诉我找不到wudri,但与hudri无关)

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

diff.CompareDocuments(new XmlDiffOptions { IgnoreAttributes = false });
此外,还需要指定比较两个方向,以标识不同节点的两个值:

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

好吧,我用您的示例Xml进行了测试,它清楚地识别了
name=“MyName1”
name=“MyName2”
之间的差异。添加
TwoWayMatch=true
选项应该会得到所需的结果,为不同的节点识别这两个值。基本上是可行的。输出很难读取,但所需的输出在那里。问题:它不适用于我在问题中提到的100+行。即使是XmlDiffLib的开发人员也认为这是其上的代码的问题
diff.CompareDocuments(new XmlDiffOptions { IgnoreAttributes = false, TwoWayMatch = true });