Получить детей в виде строки с xmlreader и C # - PullRequest
0 голосов
/ 12 января 2012

Я анализирую строку xml с использованием xmlreader в c #, но при анализе мне иногда нужно получить полное содержимое узла, включая дочерние элементы с тегами, и при этом продолжить анализ.

ReadInnerXML и ReadOutterXML разбивают все для меня

пример XML:

<?xml version="1.0" standalone="yes"?>
<main>
    <parse1> //finding this will get full inner or outter xml - either one - my issue
         <parse2 /> // even getting the children above might still need parse chldren
         <negligeable /> // not all children interest me
   </parse1>
   <parse3>some text</parse3> // not all children of main are the same but all need be parsed
</main>

Надеюсь, это даст вам общее представление о том, что мне нужно

Я могу анализировать 2 и 3 прямо сейчас и игнорировать то, что мне не нужно, но если я использую ReadInnerXML или ReadOutterXML, когда я найду тег, то он не позволит мне анализировать что-либо еще - даже тег, который находится снаружи.

ReadInnerXML и ReadOutterXML действительно возвращают нужный мне текст, но все остальное не анализируется

РЕДАКТИРОВАТЬ: в соответствии с предложением dasblinkenlight, некоторый код:

using (XmlReader reader = XmlReader.Create(new StringReader(XmlString)))
{
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element:
                switch (reader.Name)
                {
                    case "parse1":
                         Console.WriteLine("Contents of Parse 1: {0}", ?function here?);
                         break;
                    case "parse2":
                         Console.WriteLine("Parse 2 tag exists");
                         break;
                    case "parse3":
                         Console.WriteLine("Contents of Parse 3: {0}", Reader.ReadElementContentAsString());
                         break;
                }
                break;
        }
    }
}

Результат должен быть (с учетом теста xml)

Contents of Parse 1: <parse2 /><negligeable />
Parse 2 tag exists
Contents of Parse 3: some text

Также пытаюсь прочитать ReadSubTree

Есть подсказки?

Ответы [ 2 ]

1 голос
/ 12 января 2012

Используя XmlDocument, вы можете легко просматривать свои элементы xml и распечатывать нужные вам элементы

Например:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(XmlString);

string parse1_Content = xmlDocument.GetElementsByTagName("parse1")[0].InnerXml;
Console.WriteLine("Contents of Parse 1: " + parse1_Content);

if(xmlDocument.GetElementsByTagName("parse2") > 0)
    Console.WriteLine("Parse 2 exists");

string parse3_Content = xmlDocument.GetElementsByTagName("parse1")[0].InnerText;
Console.WriteLine(parse3_Content);
1 голос
/ 12 января 2012

В основном readinnerxml читает до конца, а XmlReader только вперед. Возможно, вам сойдет с рук XmlDocument, или другим способом будет создание другого считывателя из того же содержимого Xml, чтение того места, где вы находитесь в оригинале, получение вашей строки и удаление «копии»

.
...