如何获取XElement的值而不是所有子节点的值?
示例xml:
test1 test2
如果我查找parent.Value,其中parent是XElement,我得到“test1test2”。 我期待的是“”。 (因为没有文字/值。
我应该寻找XElement的哪些属性?
在
元素中查找文本数据时,您应该查找NodeType
属性等于XmlNodeType.Text
子节点。 这些节点的类型为XText
。 以下示例说明了这一点:
var p = XElement .Parse("Hellotest1 Worldtest2 ! "); var textNodes = from c in p.Nodes() where c.NodeType == XmlNodeType.Text select (XText)c; foreach (var t in textNodes) { Console.WriteLine(t.Value); }
更新:如果你想要的只是第一个Text节点,如果有的话,这里是一个使用LINQ方法调用而不是查询理解语法的例子:
var firstTextNode = p.Nodes().OfType().FirstOrDefault(); if (firstTextNode != null) { var textValue = firstTextNode.Value; ...do something interesting with the value }
注意:在此方案中,使用First()
或FirstOrDefault()
将比Count() > 0
更FirstOrDefault()
。 Count
始终枚举整个集合,而FirstOrDefault()
只会枚举,直到找到匹配项。
您可以连接parent
中所有XText
节点的值:
XElement parent = XElement.Parse( @"Hellotest1 Worldtest2 ! "); string result = string.Concat( parent.Nodes().OfType().Select(t => t.Value)); // result == "HelloWorld!"
为了比较:
// parent.Value == "Hellotest1Worldtest2!" // (parent.HasElements ? "" : parent.Value) == ""
令人惊讶的是,微软某处的编码器认为将所有文本值作为连接和无限制的字符串返回会很有用。 幸运的是,另一个MS开发人员写了一个XElement扩展来返回他们所谓的文本节点的“浅值”。 对于那些通过点击链接获得帮助的人,function如下……
public static string ShallowValue(this XElement element) { return element .Nodes() .OfType() .Aggregate(new StringBuilder(), (s, c) => s.Append(c), s => s.ToString()); }
你这样称它,因为它也给你所有的空白(或者,想到它,你可以在扩展中修剪它,无论如何)
// element is a var in your code of type XElement ... string myTextContent = element.ShallowValue().Trim();
msdn说:
包含此元素的所有文本内容的String。 如果有多个文本节点,它们将被连接。
所以行为是可以预期的。
你可以通过这样做来解决你的问题:
string textContent = parent.HasElements ? "" : parent.Value;
// Create the XElement XElement parent = XElement.Parse( @"Hellotest1 Worldtest2 ! "); // Make a copy XElement temp=new XElement(parent); // remove all elements but root temp.RemoveNodes(); // now, do something with temp.value, eg Console.WriteLine(temp.value);