C#中的XElement值

10

如何获取XElement的值而不获取其子元素?

以下是一个示例:

<?xml version="1.0" ?>
<someNode>
    someValue
    <child>1</child>
    <child>2</child>
</someNode>
如果我使用XElement.Value来获取<someNode>,我将得到字符串"somevalue<child>1</child><child>2<child>",但我只想获得"somevalue"而不是包含"<child>1</child><child>2<child>"的子串。
3个回答

12

你可以比使用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类型的节点的值感兴趣。 - Ramón García-Pérez
@BBHorus:如果你想查看所有节点,那么是的,你需要对它们进行迭代。不清楚你想做什么-也许你想添加一个新问题。 - Jon Skeet
哦,算了,我现在意识到我确实需要一些文本节点,但不是第一个和最后一个。我有这个元素:<package>package <name>com</name>.<name>sample</name>.<name>app1</name>;</package>我想要的是像这样的值:com.sample.app1,我认为我需要使用一些正则表达式或其他类似的东西来迭代子节点并仅获取跳过第一个和最后一个元素的元素。 - Ramón García-Pérez
2
@BBHorus:你几乎肯定不应该使用正则表达式。这几乎总是处理XML的错误方法。 - Jon Skeet
不是XML本身,而是XML元素中的值,它始终包含这两个部分:以“package”开头,以“;”结尾。我不需要这两部分,但其他部分我需要。感谢您的解释和帮助。 - Ramón García-Pérez

3

没有直接的方法。您需要迭代和选择。例如:

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节点。 - shadeglare
@MaxFX:这仍然会递归枚举元素内的所有节点。虽然它是隐藏的,但仍在发生。请参阅我的答案以避免这种情况。 - Jon Skeet
1
你可以简单地编写 var textNodes = doc.DescendantNodes().OfType<XText>(); - Porkopek

0

我认为你想要的是第一个后代节点,因此类似于以下内容:

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

XElement 表示您的 <someNode> 元素。

您可以明确地请求第一个文本元素(即 "somevalue"),因此也可以这样做:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接