Какой самый простой способ получить только текст верхнего уровня XmlElement? - PullRequest
1 голос
/ 11 сентября 2009

Предположим, у меня есть 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 ]

3 голосов
/ 11 сентября 2009

Вы можете использовать выражение XPath, которое специально ищет текстовый узел (извините за C #)

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

(где doc - это XmlDocument, содержащий ваш XML)

2 голосов
/ 11 сентября 2009
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()");

Это будет работать, даже если нужный вам текст находится между двумя дочерними узлами.

2 голосов
/ 11 сентября 2009

Технически, текст внутри 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();
    }
}
1 голос
/ 11 сентября 2009
Dim txt As String

If TypeOf XmlElement.FirstChild Is Xml.XmlText Then
        txt = XmlElement.FirstChild.InnerText
End If
0 голосов
/ 11 сентября 2009

Вот пример, который даст вам текст запроса:

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);

        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...