【问题标题】:XElement value in C#C# 中的 XElement 值
【发布时间】:2011-03-14 13:22:15
【问题描述】:

如何在不获取子元素的情况下获取XElement的值?

一个例子:

<?xml version="1.0" ?>
<someNode>
    someValue
    <child>1</child>
    <child>2</child>
</someNode>

如果我将 XElement.Value 用于&lt;someNode&gt;,我会得到"somevalue&lt;child&gt;1&lt;/child&gt;&lt;child&gt;2&lt;child&gt;" 字符串,但我只想得到没有"&lt;child&gt;1&lt;/child&gt;&lt;child&gt;2&lt;child&gt;" 子字符串的“somevalue”。

【问题讨论】:

    标签: c# xml xelement


    【解决方案1】:

    您可以比使用 Descendants 更简单一些 - Nodes 方法只返回直接子节点:

    XElement element = XElement.Parse(
        @"<someNode>somevalue<child>1</child><child>2</child></someNode>");
    var firstTextValue = element.Nodes().OfType<XText>().First().Value;
    

    请注意,即使在子元素出现在文本节点之前的情况下,这也会起作用,如下所示:

    XElement element = XElement.Parse(
        @"<someNode><child>1</child><child>2</child>some value</someNode>");
    var firstTextValue = element.Nodes().OfType<XText>().First().Value;
    

    【讨论】:

    • 如果我想获取所有节点的值,我是否需要迭代节点列表?我对不是 XText 类型的节点的值感兴趣
    • @BBHorus:好吧,如果您想查看所有节点,那么是的,您需要遍历它们。真的不清楚您要做什么 - 您可能想添加一个新问题。
    • 哦,没关系,现在我意识到我确实需要一些文本节点,但第一个和最后一个。我有这个元素: package com.sample.app1; 我想要的是这样的值:com .sample.app1,我想我需要使用一些正则表达式或其他东西,比如迭代子节点并只获取跳过第一个和最后一个元素的元素。
    • @BBHorus:您几乎应该当然不使用正则表达式。这几乎是总是错误的 XML 处理方法。
    • 不是XML就是XML元素中的值,它总是包含这两部分:以“package”开头,以“;”结尾那些我不想要的,但其余的。感谢您的澄清和帮助
    【解决方案2】:

    没有直接的方法。你必须迭代和选择。例如:

    var doc = XDocument.Parse(
        @"<someNode>somevalue<child>1</child><child>2</child></someNode>");
    var textNodes = from node in doc.DescendantNodes()
                    where node is XText
                    select (XText)node;
    foreach (var textNode in textNodes)
    {
        Console.WriteLine(textNode.Value);
    }
    

    【讨论】:

    • 非常感谢。在我的程序中,我需要完整枚举 xml 节点并更改每个值。使用您的示例,我不需要在 xml 节点的递归枚举中。
    • @MaxFX:这仍然会递归枚举元素内的所有节点。它是隐藏的,但它仍在发生。请参阅我的答案以了解避免这种情况的方法。
    • 你可以简单的写成 var textNodes = doc.DescendantNodes().OfType();
    【解决方案3】:

    我认为你想要的是第一个后代节点,所以类似于:

    var value = XElement.Descendents.First().Value;
    

    其中XElement 是代表您的&lt;someNode&gt; 元素的元素。

    您可以专门要求第一个文本元素(即“somevalue”),因此您也可以这样做:

    var value = XElement.Descendents.OfType<XText>().First().Value;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-16
      • 2019-03-27
      相关资源
      最近更新 更多