C# C语言中的Xml比较#
我试图用C代码比较两个Xml文件。 我想忽略Xml语法差异(即前缀名称)。 为此,我正在使用微软的C#API。 它适用于某些Xml,但我找不到方法将其配置为适用于以下两种Xml: XML A:C# C语言中的Xml比较#,c#,xml,C#,Xml,我试图用C代码比较两个Xml文件。 我想忽略Xml语法差异(即前缀名称)。 为此,我正在使用微软的C#API。 它适用于某些Xml,但我找不到方法将其配置为适用于以下两种Xml: XML A: <root xmlns:ns="http://myNs"> <ns:child>1</ns:child> </root> 1. XML B: <root> <child xmlns="http://myNs">1<
<root xmlns:ns="http://myNs">
<ns:child>1</ns:child>
</root>
1.
XML B:
<root>
<child xmlns="http://myNs">1</child>
</root>
1.
我的问题是:
我知道您关注的不是单元测试,但是可以比较两个XML文件,我认为它能够解决您的示例。也许您可以查看代码并找出解决方案。从每个xml文件加载XmlDocument实例,然后比较xml DOM,这可能是个好主意?如果对每一项都进行了正确的验证,这将为比较提供一个共同点,并允许标准差异报告。甚至可以使用delta从一个文档更新另一个文档。这些文档在语义上并不等价。第一个元素的顶级元素位于
http://myNS
名称空间,而第二个名称空间的顶级元素位于默认名称空间中
这两个文档的子元素是等效的。但文件本身并非如此
编辑:
xmls:ns=”之间有着天壤之别http://myNS“
和xmlns=”http://myNS“
,我似乎忽略了这一点。无论如何,这些文档在语义上是等价的,我错了。这些文档是同构的,如下面的程序所示。我认为,如果您使用XmlDiffOptions.ignorenamespace
和XmlDiffOptions.IgnorePrefixes
来配置Microsoft.XmlDiffPatch.XmlDiff
,您就会得到想要的结果
using System.Linq;
using System.Xml.Linq;
namespace SO_794331
{
class Program
{
static void Main(string[] args)
{
var docA = XDocument.Parse(
@"<root xmlns:ns=""http://myNs""><ns:child>1</ns:child></root>");
var docB = XDocument.Parse(
@"<root><child xmlns=""http://myNs"">1</child></root>");
var rootNameA = docA.Root.Name;
var rootNameB = docB.Root.Name;
var equalRootNames = rootNameB.Equals(rootNameA);
var descendantsA = docA.Root.Descendants();
var descendantsB = docB.Root.Descendants();
for (int i = 0; i < descendantsA.Count(); i++)
{
var descendantA = descendantsA.ElementAt(i);
var descendantB = descendantsB.ElementAt(i);
var equalChildNames = descendantA.Name.Equals(descendantB.Name);
var valueA = descendantA.Value;
var valueB = descendantB.Value;
var equalValues = valueA.Equals(valueB);
}
}
}
}
使用System.Linq;
使用System.Xml.Linq;
名称空间SO_794331
{
班级计划
{
静态void Main(字符串[]参数)
{
var docA=XDocument.Parse(
@"1");
var docB=XDocument.Parse(
@"1");
var rootNameA=docA.Root.Name;
var rootNameB=docB.Root.Name;
var equalRootNames=rootNameB.Equals(rootNameA);
var-degenantsa=docA.Root.subgenders();
var-degenantsb=docB.Root.subgenders();
对于(int i=0;i
我有XML和.NET Framework MSDN论坛。
简而言之,他建议使用XQuery 1.0的deep equal函数,并提供了一些C#实现。似乎有效。这是不正确的。两个文档的顶级元素都位于默认名称空间中。第一个文档的顶级元素只有在声明为或实际上我的重点是单元测试时才能位于名称空间中。然而,XMLUnit在.Net中似乎也有类似的限制。它实际上是为上面的XML工作的,但是有轻微的变化打破了它。它是一个选项——但是它是我自己做的,我认为这是一个常见的解决方案的常见问题。无知的步调对我不好。我认为不同名称空间的文档在语义上是不同的。我明白,但在比较时,即使使用了IgnoreNamespaces,XMLPatch&Diff似乎也考虑了名称空间。我用两个文档和一个文档测试了这一点。Diff&Patch认为它们是不同的。不幸的是,我现在还没有得到代码,所以我不能100%确认这一点。在我之前的评论中,A和B本来是两个URL,但它们被转换为链接…当我尝试时,我发现它们相等,得到的结果与你得到的结果相同。我想我以前犯过一个错误。继续调查。。。