我有一组需要处理的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的方法,用于在递归数据中构建层次结构。
答案 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));