2012-01-12 5 views
0

Я разбираю строку xml с помощью xmlreader в C#, но, поскольку я разбираюсь, мне иногда нужно получить полный контент узла, включая дочерние элементы с тегами, и по-прежнему иметь возможность продолжить синтаксический анализ.Получить детей как строку с 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 сделать возвращает текст, мне нужно правильно, но вызывают все остальное не будет прочитан

EDIT: как на 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 

Am также пытается ReadSubTree

Любые подсказки?

+0

это очень трудно понять, в чем проблема, не видя код. Не могли бы вы добавить некоторые из своих C# к вашему вопросу, чтобы проиллюстрировать проблему? – dasblinkenlight

+0

нормально, но проблема не в коде, а в том, о чем я прошу - в основном, итерации в два раза тот же узел - я скоро добавлю код образца – 537mfb

+0

Если я правильно вас понимаю, 'ReadSubtree' не поможет, поскольку он позиционирует оригинал читатель в конце элемента, на который он вызывается. Все, что он действительно делает, - это «запечатанный» читатель, который видит только этот элемент. Но я должен добавить, что я не совсем понимаю, что вы пытаетесь сделать. Пожалуйста, уточните свой вопрос, если это возможно. – harpo

ответ

1

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

+0

Я буду смотреть в xmldocument завтра (почти конец дня здесь). Ваша вторая идея заключается в том, что я пытаюсь достичь сегодня, но я бы знал, где я в оригинале? помните, что мой пример является простым, и я мог бы использовать теги n для синтаксического анализа. – 537mfb

+0

Просто прочитав мои собственные слова, вы получили идею - счетчик тегов - тогда просто пропустите n тегов на копии - попробуете это завтра, если к тому времени кто-то не придумает лучшего решения здесь. – 537mfb

+0

«В основном readinnerxml читает всю дорогу до end "- Это то, что я вижу - хотя это только возвращает до – 537mfb

1

Использование 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); 
+0

Я пробовал такой подход, потому что это не будет работать на более сложных примерах - например, если есть 2 элемента parse1, и только один имеет parse2 элемент всегда будет печатать синтаксис 2, и я не буду знать, в каком элементе parse 1 будет находиться – 537mfb

+1

. GetElementByTagName возвращает вам список элементов, вы можете проверить родительское имя элемента перед печатью, если существует «Parse2» или проверить, существует ли «Parse1» имеет дочерние узлы с именем «Parse2». Также я рекомендую вам посмотреть документацию, я думаю, что есть много способов, которые могут вам помочь –

+0

Я буду смотреть на нее на всякий случай - но, как я сказал в ответ Тони, я решил эту проблему другим способом - не идеально, но работает для меня в начальных тестах - подтвердил ваш комментарий – 537mfb

Смежные вопросы