如何获取XElement的值而不是所有子节点的值?

NiT*_*TiN 25 c# xelement

示例xml:

<parent>
<child>test1</child>
<child>test2</child>
</parent>
Run Code Online (Sandbox Code Playgroud)

如果我查找parent.Value,其中parent是XElement,我得到"test1test2".我期待的是"".(因为没有文字/值.

我应该寻找XElement的哪些属性?

Pet*_*old 25

<parent>元素中查找文本数据时,您应该查找NodeType属性等于的子节点XmlNodeType.Text.这些节点将是类型XText.以下示例说明了这一点:

var p = XElement
    .Parse("<parent>Hello<child>test1</child>World<child>test2</child>!</parent>");

var textNodes = from c in p.Nodes()
                where c.NodeType == XmlNodeType.Text
                select (XText)c;

foreach (var t in textNodes)
{
    Console.WriteLine(t.Value);
}
Run Code Online (Sandbox Code Playgroud)

更新:如果你想要的只是第一个Text节点,如果有的话,这是一个使用LINQ方法调用而不是查询理解语法的例子:

var firstTextNode = p.Nodes().OfType<XText>().FirstOrDefault();
if (firstTextNode != null)
{
    var textValue = firstTextNode.Value;
    ...do something interesting with the value
}
Run Code Online (Sandbox Code Playgroud)

注意:使用First()FirstOrDefault()将比Count() > 0此方案更高效.Count始终枚举整个集合,同时FirstOrDefault()只会枚举直到找到匹配项.


dtb*_*dtb 8

您可以连接所有XText节点的值parent:

XElement parent = XElement.Parse(
    @"<parent>Hello<child>test1</child>World<child>test2</child>!</parent>");

string result = string.Concat(
    parent.Nodes().OfType<XText>().Select(t => t.Value));

// result  ==  "HelloWorld!"
Run Code Online (Sandbox Code Playgroud)

为了比较:

// parent.Value  ==  "Hellotest1Worldtest2!"

// (parent.HasElements ? "" : parent.Value)  ==  ""
Run Code Online (Sandbox Code Playgroud)


Ste*_*ert 8

令人惊讶的是,Microsoft 某处的编码人员认为将所有文本值作为连接且未定界的字符串返回会很有用。幸运的是,另一个MS开发者写了的XElement扩展返回他们所谓的文本节点的“浅价值”在这里。对于那些通过点击链接获得威利的人,功能如下...

    public static string ShallowValue(this XElement element)
    {
        return element
               .Nodes()
               .OfType<XText>()
               .Aggregate(new StringBuilder(),
                          (s, c) => s.Append(c),
                          s => s.ToString());
    }
Run Code Online (Sandbox Code Playgroud)

你这样称呼它,因为它也给了你所有的空白(或者,想想看,你可以在扩展中修剪它,无论如何)

// element is a var in your code of type XElement ...
string myTextContent = element.ShallowValue().Trim();
Run Code Online (Sandbox Code Playgroud)