我刚刚开始使用LINQ to XML,我在获取给定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>
Run Code Online (Sandbox Code Playgroud)
我使用以下测试方法:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我输出两行:
value 1
value 2value A
Run Code Online (Sandbox Code Playgroud)
第一行显示第一个孩子的内容 - 这没关系.然而,第二行不仅显示了第一个孩子的文本内容,还显示了该孩子的任何后代.
如何在没有孙子文本内容的情况下获得第二个孩子的文本内容?
还要注意的是,样品只是一个简单的例子来说明我在做什么,并在生产中我不一定会知道孩子元素叫什么(如果有的话),但我应该能够获得元素我需要得到来自的文本内容.
Jon Skeet的回答有助于解决方案.只需用以下内容替换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());
}
Run Code Online (Sandbox Code Playgroud)
如果有多个文本节点,您想要做什么?例如,您可以将它们全部加在一起:
var text = string.Join("", element.Nodes.OfType<XText>().Select(x => x.Value));
Run Code Online (Sandbox Code Playgroud)
编辑:如果你只想要一个元素,它比你显示的更容易:
var textNode = xElem.Nodes.OfType<XText>().FirstOrDefault();
if (textNode != null)
{
Console.WriteLine(textNode.Value);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4804 次 |
| 最近记录: |