linq-to-xml – LINQ to XML – 获取给定的XElement文本内容,不
发布时间:2020-12-16 23:13:26 所属栏目:百科 来源:网络整理
导读:我刚刚开始使用 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'v
我刚刚开始使用
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> 我使用以下测试方法: 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 第一行显示第一个孩子的内容 – 这没关系.然而,第二行不仅显示了第一个孩子的文本内容,还显示了该孩子的任何后代. 如何在没有孙子文本内容的情况下获得第二个孩子的文本内容? 还要注意,示例只是一个简单的例子来说明我在做什么,在生产中我不一定知道调用子元素是什么(如果有的话),但我应该能够得到我需要的元素来获取来自的文本内容. 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()); } 解决方法
如果有多个文本节点,您想要做什么?例如,您可以将它们全部加在一起:
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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容