2011-09-16 71 views
0

我想比较2个XML文件。 如果两者具有相同的结构,则看起来很容易。但不是在我的情况:( 我的文件看起来像:XML比较器C#

<root> 
<t> 
    <child1> 
    <cc1>val</cc1> 
    <cc2>val</cc2> 
    ...... 
    </child1> 
    <child2> 
    <cc1>val</cc1> 
    <cc2>val</cc2> 
    ...... 
    </child2> 
    <child2> 
    <cc1>val</cc1> 
    <cc2>val</cc2> 
    ...... 
    </child2> 
    ....... 
    <child3> 
    <cc1>val</cc1> 
    <cc2>val</cc2> 
    ...... 
    </child3> 
    .... 
</t> 
<t> 
    ... 
</t> 
..... 
</root> 

而且他们可以有CHILDES的任何号码,CHILDES的CHILDES ... 任务是

  1. 如果只比较一个已定义的块,我需要搜索它以获取第一个孩子的孩子的值(本例中为child1.cc1.value)

  2. 比较期间可以跳过一些节点(跳过的节点的名称存储在某处,例如,在字符串数组)

  3. 有可能有多个相同的节点。如果child2不被忽略,那么我需要确保它们的数量是相同的,并且它们都与相应的第二个文件重合。因此,有可能是下一个情况:

一号文件包含:

<child2><cc1>1</cc1>...</child2> 
<child2><cc1>3</cc1>...</child2> 
<child2><cc1>2</cc1>...</child2> 

2ST文件包含:

<child2><cc1>2</cc1>...</child2> 
<child2><cc1>1</cc1>...</child2> 
<child2><cc1>3</cc1>...</child2> 

这意味着它们是相互对应。 所以他们可以按随机顺序。

现在我不能决定如何实现这个算法。我建议使用DataSet对象,但是这种XML结构对于简单地使用DataTables,dataRows等来说看起来太难了。

现在我正在尝试XmlNodes。但我还没有意识到那部分,我有几个相同的节点,随机顺序不同的数据。

任何想法?

回答

2

你的XML文件有多大?这个结构在现实中有多复杂?

如果不是太大或复杂,那么我会建议将整个文件解析到类结构中,然后对类的属性进行验证。例如(伪)...

xmlClass file1 = new xmlClass(file1info); 
xmlClass file2 = new xmlClass(file2info); 

//Custom classes have now parsed XML files in whichever way you like 

if (file1.numberOfChildren != file2.numberOfChildren) 
{ 
    //comparison fail 
} 
elseif (!file1.orderOfChildrenSame(file2)) 
{ 
    //comparison fail 
} 
else 
{ 
    //comparison success 
} 

显然确切落实的方法和属性您xmlClass将取决于您的具体要求。

XmlClass可能是粗糙的布局......

using System; 
using System.Collections.Generic; 
using System.Xml; 

public class XmlClass 
{ 
    private XmlDocument _xmlDoc; 
    private List<ChildClass> _children As New List<ChildClass>(); 

    public XmlClass(FileInfo fil){ 
     _xmlDoc = New XmlDocument(); 
     _xmlDoc.Load(fil.FullName); 

     ParseChildren(); 

     _xmlDoc = Nothing; 
    } 

    private void ParseChildren(){ 
     XmlNodeList ndl = _xmlDoc.SelectNodes("/root/t") //select all <t>s 
     foreach (xmlNode nodT in ndl.Nodes){ 
      foreach (xmlNode nodChild in nodT.ChildNodes()){ 
       _children.Add(new ChildClass(nodChild)); 
      } 
     } 
     // Now _children contains all child nodes of <t>s and can be worked with logically 
    } 

    public int numberOfChildren 
    { 
     get {return _children.Count();} 
    } 
} 

你显然需要实现ChildClass - 这又可以包含ChildClass自身的集合(允许你描述的层次)。您还需要根据需要实施其他验证方法。此外,您可能需要实现其他类以表示您感兴趣的文档中的其他节点类型。

为了验证,不要分析超过您的需要! - 这取决于你的最终目标是什么。

PS

我也建议,这种XML格式是不是在<child1><child2>的建立方面非常“好看”。这将是更XMLesque有<child id="1"><child id="2">等。想必<child1><child2>基本上相同类型的节点 ...

+0

>>'<子ID = “1”>,<子ID =”噢,如果我可以选择... 但是你的想法非常漂亮!至少我喜欢它,我会尝试。 – Ksice

+0

@Ksice我不会说这很漂亮!但是我使用了类似的代码来验证XML文档的完整性。将它分解成类可以帮助您在头脑中澄清问题。顺便说一句,上面的代码是完全未经测试 - 可能需要一些调整:) –