如何在C#中使用LINQ解析复杂的XML到List <string>?

时间:2017-02-15 11:53:04

标签: c# xml linq

如何在c#中使用LINQ将复杂的XML解析为List?

例如:

<para l="3645" t="2387" r="7665" b="2885" alignment="left" li="3240" lsp="exactly" lspExact="492" language="en" styleRef="paraStyle_1_1_62">
                <ln l="3645" t="2370" r="7665" b="2775" baseLine="2775" underlined="none" subsuperscript="none" fontSize="2650" fontFace="Tahoma" fontFamily="swiss" fontPitch="variable" spacing="60" scale="700">
                  <wd l="3645" t="2370" r="4365" b="2775">908</wd>
                  <space />
                  <wd l="4740" t="2370" r="4920" b="2775">W</wd>
                  <space />
                  <wd l="5295" t="2370" r="7665" b="2775">CUMBERLAN</wd>
                </ln>
              </para>
              <para l="4740" t="2895" r="6825" b="3400" alignment="left" li="4392" lsp="exactly" lspExact="504" language="en" styleRef="paraStyle_1_1_62">
                <ln l="4740" t="2895" r="6825" b="3315" baseLine="3300" underlined="none" subsuperscript="none" fontSize="2650" fontFace="Tahoma" fontFamily="swiss" fontPitch="variable" spacing="60" scale="700">
                  <wd l="4740" t="2895" r="5955" b="3315">DUNN,</wd>
                  <space />
                  <wd l="6375" t="2895" r="6825" b="3300">NC</wd>
                </ln>
              </para>

输出应该是一个List,其第一个索引将是第一个<para>标签之间的值,即&#34; 908 W CUMBERLN&#34; 第二个指数将是&#34; DUNN NC&#34; 等等。

这是我的代码

 doc = XDocument.Load(@"C:/Users/jarvisPC/Desktop/1.xml");

 var data = from q in doc.Descendants("para").Descendants("ln")
            where q.Element("wd") != null
            select new List<string>
            {                           
               q.Element("wd").Value
            };

但是它读取<wd>标签之间的第一个文本,即输出作为列表,其第一个索引是&#34; 908&#34;第二个指数是&#34; DUNN&#34;。

1 个答案:

答案 0 :(得分:1)

问题是您只选择了第一个<wd>元素。

使用Aggregate

var data = from para in doc.Descendants().Where(d => d.Element("wd") != null)
            select new List<string>
            {
                para.Elements("wd").Select(x => x.Value).Aggregate((i, j) => i + " " + j)
            };

输出:

  

908 W CUMBERLAN

     

DUNN,NC