LINQ to XML(动态XML)

3
我有一个XML文件,其结构与下面所示的相似: 我想使用LINQ to XML选择标题和子项。我遇到的困难是:有时子项可能只有一个,有时可能有20个子项,我需要将它们添加到List<string>中。
<?xml version="1.0"?>
<items>
    <item>
        <title>Name of the title</title>
        <subitem>Test</subitem>
        <subitem1>Test</subitem1>
        <subitem2>Test</subitem2>
        <subitem3>Test</subitem3>
        <subitem4>Test</subitem4>
        <subitem5>Test</subitem5>
    </item>
    <item>
        <title>Name of the title</title>
        <subitem>Test</subitem>
        <subitem1>Test</subitem1>
        <subitem2>Test</subitem2>
        <subitem3>Test</subitem3>
    </item>
    <item>
        <title>Name of the title</title>
        <subitem>Test</subitem>
        <subitem1>Test</subitem1>
    </item>
</items>

你能展示一下你想要的输出样例吗? - JSprang
2个回答

1

解决方案,包括获取标题,是:

XDocument yourXDocument = XDocument.Load(yourXmlFilePath);
IEnumerable<Tuple<XElement, IEnumerable<XElement>>> yourSubItems =
    yourXDocument.Root.Descendants()
                 .Where(xelem => xelem.Name == "title")
                 .Select(xelem => new Tuple<XElement, IEnumerable<XElement>>(xelem, xelem.Parent.Elements().Where(subelem => subelem.Name.LocalName.StartsWith("subitem")));

1
@Eugene:元组提供了一种通用的构造方法,可以将不同类型的数据组合在一起。Tuple<string,int,DateTime>是一个对象,它具有类型为string的Item1属性、类型为int的Item2属性和类型为DateTime的Item3属性。我创建的元组具有Item1,它是XElement的标题,以及Item2,它是表示标题子项的XElements的IEnumerable。 - Jimmy Hoffa

1
XDocument xdoc = XDocument.Load(path_to_xml);
var query = from i in xdoc.Descendants("item")
            select new
            {
                Title = (string)i.Element("title"),
                Subitems = i.Elements()
                            .Where(e => e.Name.LocalName.StartsWith("subitem"))
                            .Select(e => (string)e)
                            .ToList()
            };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接