获取XmlElement的顶级文本的最简单方法是什么?

时间:2009-09-11 13:51:18

标签: .net xml vb.net

假设我有一些XmlElement;我们称之为element。如果我想获取该元素的所有子节点,我可以调用element.ChildNodes。如果我想要元素及其所有子元素的文本,那么我可以使用element.InnerText

但是,假设我有一些看起来像这样的XML:

<TopElement attr1="value1" attr2="value2">
    This is the text I want.
    <ChildElement1>This is text I don't want.</ChildElement1>
    <ChildElement2>This is more text I don't want.</ChildElement2>
</TopElement>

如果我选择element.InnerText,我得到的是:

  

这是我想要的文字。这是我的文字   不想要。这是我不做的更多文字   想。

如果我只想要TopElement中的文本但不想要任何子文本,我可以这样做:

Dim txt As String
For Each child As Xml.XmlNode In XmlElement.ChildNodes
    If TypeOf child Is Xml.XmlText Then
        txt = child.InnerText
        Exit For
    End If
Next

但这对我来说似乎很愚蠢。当然有更好的方法吗?

编辑:对不起我最初没有说明这个:我正在寻找一个不涉及LINQ的解决方案(我们在这里使用.NET 2.0处于黑暗时代)。

5 个答案:

答案 0 :(得分:3)

您可以使用专门查找文本节点的XPath表达式(抱歉C#)

XmlText text = doc.SelectSingleNode("/TopElement/text()") as XmlText;
if (text != null)
{
    Console.WriteLine(text.Value);
}

(其中doc是包含您的XML的XmlDocument

答案 1 :(得分:2)

从技术上讲,TopElement中的文本是一个子节点。

class Program
{
    static string xml = @"<Top>Text<child/><child/></Top>";

    static void Main(string[] args)
    {
        XmlDocument xdoc = new XmlDocument();
        xdoc.LoadXml(xml);

        Console.WriteLine(xdoc.DocumentElement.ChildNodes[0].Value);

        Console.ReadLine();
    }
}

答案 2 :(得分:2)

XmlDocument document = new XmlDocument();
document.LoadXml(yourXml);

//Find the first child whos type is XmlText
var nodeYouWant = document.DocumentElement.ChildNodes.OfType<System.Xml.XmlText>().FirstOrDefault();

修改

由于你不能使用LINQ,你仍然可以使用好的'XQuery并请求节点文本

XmlNode nodeYouWant = document.DocumentElement.SelectSingleNode("./text()");

即使您想要的文本位于两个子节点之间,这也会起作用。

答案 3 :(得分:1)

Dim txt As String

If TypeOf XmlElement.FirstChild Is Xml.XmlText Then
        txt = XmlElement.FirstChild.InnerText
End If

答案 4 :(得分:0)

以下示例将为您提供请求文本:

static void Main(string[] args)
        {
            var document = XDocument.Load("../../TestXmlFile.xml");

            if(document.Root == null) return; 

            var text = ((XText) document.Root.FirstNode).Value; 

            Console.WriteLine(text);

        }