LINQ to XML - 获取给定 XElement 的文本内容,不包含子元素的文本内容

2024-03-13

我刚刚开始使用LINQ 到 XML http://en.wikipedia.org/wiki/Language_Integrated_Query#LINQ_to_XML_.28formerly_called_XLINQ.29,并且我无法获取给定 XElement 的文本内容,而无法同时获取所有子元素的文本内容。

例如,如果我有以下 XML 文档:

<?xml version="1.0" encoding="utf-8" ?>
<root xmlns="example.org/rootns">This is root value
    <children>
        <child name='child 1'>value 1</child>
        <child name='child 2'>value 2
            <grandchild name='grandchild A'>value A</grandchild>
        </child>
    </children>
</root>

我使用以下测试方法:

private static void Test()
{
    string xString = @"<?xml version=""1.0"" encoding=""utf-8"" ?><root xmlns=""example.org/rootns"">This is root value<children><child name='child 1'>value 1</child><child name='child 2'>value 2<grandchild name='grandchild A'>value A</grandchild></child></children></root>";

    var xDoc = XDocument.Parse(xString);

    XNamespace ns = @"example.org/rootns";
    string elemName = "child";

    var xElems = from e in xDoc.Descendants(ns + elemName)
                 select e;

    foreach (var xElem in xElems)
    {
        Console.WriteLine(xElem.Value);
    }
}

然后我得到两行输出:

    value 1
    value 2value A

第一行显示第一个子项的内容 - 这没关系。然而,第二行不仅显示第一个孩子的文本内容,还显示该孩子的任何后代。

如何获取仅第二个孩子的文本内容而不同时获取孙子的文本内容?

另请注意,该示例只是一个简单的示例,用于说明我正在做什么,在生产中我不一定知道子元素的名称(如果有),但我应该能够获取获得所需的元素文本内容来自.


乔恩·斯基特的回答帮助解决了这个问题。只需将 foreach 循环替换为以下内容即可选择文本 XNode,而不是 XElement 的值:

...
foreach (var xElem in xElems)
{
    var values = from n in xElem.Nodes()
                 where n.NodeType == System.Xml.XmlNodeType.Text
                 select n;

    if (values != null && values.Count() > 0)
        Console.WriteLine(values.First());
}

如果有你想做什么multiple文本节点?例如,您可以将它们全部连接在一起:

var text = string.Join("", element.Nodes.OfType<XText>().Select(x => x.Value));

编辑:如果您只想要一个元素,那么它比您显示的更容易:

var textNode = xElem.Nodes().OfType<XText>().FirstOrDefault();
if (textNode != null)
{
    Console.WriteLine(textNode.Value);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LINQ to XML - 获取给定 XElement 的文本内容,不包含子元素的文本内容 的相关文章

随机推荐