未知的xmls集合

时间:2011-08-18 19:01:07

标签: c# xml linq

我有一组需要处理的XML(在2和6之间变化)(遍历并检查某些数据和关系) - XML有一些“递归数据”  这是一个简单的例子,涉及用于解释的测试数据 - 2个文件被视为示例

      File1.xml:
<some root------standard header not entered for the example----->
<parent>
    <ID>AB-1234</ID>
    <Description>Good book</Description>
    <Date_Created>08-10-2011</Date_Created>
    <child>
          <ID>BC-0001</ID>
          <Description>Nice</Description>
     </child>
</parent>
<parent>
    <ID>BC-0001</ID>
    <Description>Work Together</Description>
    <Date_Created>08-10-2011</Date_Created>
    <child>
          <ID>DC-0011</ID>
          <Description>Happy</Description>
     </child>
</parent>

  File2.xml:
<some root------standard header not entered for the example----->
<parent>
    <ID>DC-0011</ID>
    <Description> book</Description>
    <Date_Created>08-10-2011</Date_Created>
    <child>
          <ID>EF-0001</ID>
          <Description>Nice</Description>
     </child>
  </parent>
  <parent>
    <ID>EF-0001</ID>
    <Description>Work Together</Description>
    <Date_Created>08-10-2011</Date_Created>
    <child>
          <ID>PQ-0011</ID>
          <Description>Happy</Description>
     </child>
  </parent>

我正在使用的代码涉及1)加载XML文件并将它们组合起来

  XDocument test1doc = XDocument.Load(@"d:\File1.xml");
  XDocument test2doc = XDocument.Load(@"d:\File2.xml");
  IEnumerable<XElement> testElist1 = test1doc.decendants("parent");
  IEnumerable<XElement> testElist2 = test2doc.decendants("parent");
  IEnumerable<XElement> testElistcombo = testElist1.union(testElist2);

2)使用testElistcombo使用foreach导航元素 - 2个foreach循环(一个用于父级,第二个用于子级) 3)遍历时使用if条件检查父ID和子ID是否相等。 我能够构建层次结构 - 没有问题。 我能够打印层次结构以及层次结构的级别值。通过在每个foreach循环中包含一个计数器。      我的输出看起来像

  AB-1234[level-0]
     >>BC-0001[level-1]
         >>DC-0011[level-3] 
                ..... and so on.

正如我说的那样没问题。 -

以下是我需要帮助的地方: 1)当文件数量增加到2到6以上时,我正在以下列方式使用联合

           XDocument test1doc = XDocument.Load(@"d:\File1.xml");
           XDocument test2doc = XDocument.Load(@"d:\File2.xml");
           XDocument test3doc = XDocument.Load(@"d:\File3.xml");
           XDocument test4doc = XDocument.Load(@"d:\File4.xml");
           XDocument test5doc = XDocument.Load(@"d:\File5.xml");
           XDocument test6doc = XDocument.Load(@"d:\File6.xml");
           IEnumerable<XElement> testElist1 = test1doc.decendants("parent");
           IEnumerable<XElement> testElist2 = test2doc.decendants("parent");
           IEnumerable<XElement> testElist3 = test3doc.decendants("parent");
           IEnumerable<XElement> testElist4 = test4doc.decendants("parent");
           IEnumerable<XElement> testElist5 = test5doc.decendants("parent");
           IEnumerable<XElement> testElist6 = test6doc.decendants("parent");

           IEnumerable<XElement> testElistcombo1 = testElist1.union(testElist2);
           IEnumerable<XElement> testElistcombo2 = testElistcombo1.union(testElist3);
           IEnumerable<XElement> testElistcombo3 = testElistcombo2.union(testElist4);
           IEnumerable<XElement> testElistcombo4 = testElistcombo3.union(testElist5);
           IEnumerable<XElement> testElistcombo5 = testElistcombo4.union(testElist6);

并使用testElistcombo5进行处理。 需要帮助:一种加载和组合XML以供处理的替代方法。

2)该过程是资源密集型的,需要花费大量时间来完成层次结构构建 需要帮助:是否有另一种处理xml的方法,用于在递归数据中构建层次结构。

1 个答案:

答案 0 :(得分:2)

问题1:您可以使用Enumerable.Aggregate函数将每个文档的元素聚合为一组元素:

IEnumerable<string> filenames = { "filename1.xml", "filename2.xml" };

IEnumerable<XDocument> documents = filenames.Select(XDocument.Load);
IEnumerable<IEnumerable<XElement>> documentsElements = documents.Select(document => document.Descendants("parent"));
IEnumerable<XElement> elements = documentsElements.Aggregate((working, next) => working.Union(next));