Как я могу прочитать все элементы в простом XML, используя XMLReader в .Net 2.0? - PullRequest
1 голос
/ 11 июля 2009

У меня есть следующий XML:

<XMLDictionary>
  <a>b</a>
  <c>d</c>
  <e>f</e>
</XMLDictionary>

Я пытаюсь получить сопоставления a: b, c: d, e: f, и я просто не могу найти, как это сделать просто.

Мой текущий код выглядит так:

    Do While reader.Read()
        If reader.NodeType = Xml.XmlNodeType.Element Then
            Me.Add(reader.Name, reader.ReadElementString)
        End If
    Loop

Проблема в том, что я не знаю, как читать содержимое элемента без вызова ReadElementString, а ReadElementString продвигает «указатель» на следующий узел (поэтому reader.Name уже имеет следующее значение). Когда в цикле я снова вызываю Read (), я пропускаю узлы.
Я пробовал несколько вариантов на эту тему, и ни одна из них не работает идеально, что указывает на то, что я упускаю что-то важное здесь.

Есть указатели?

Спасибо

Ответы [ 4 ]

2 голосов
/ 11 июля 2009

Я не знаю, использовал бы я XmlReader для того, что вы делаете, вероятно, просто XmlDocument, но если вам нужен читатель, возможно, что-то вроде этого может работать:

Dim lastNode As String = string.Empty
Do While reader.Read()
     If reader.NodeType = Xml.XmlNodeType.Element Then
        lastNode = reader.Name
     Else If reader.NodeType = Xml.XmlNodeType.Text AND NOT string.IsNullOrEmpty(lastNode) THEN
         Me.Add(lastNode,reader.Value)
         lastNode = string.Empty    
     End If
Loop

Простите за любые синтаксические ошибки; Прошло много времени с момента написания на VB.net. Это базовый конечный автомат, который сначала определяет, найден ли элемент, а затем начинает поиск текстового значения.

0 голосов
/ 11 июля 2009
   Dim name As String
   Dim value As String

   While reader.Read()
        If reader.NodeType = XmlNodeType.Element Then
            name = reader.Name
            reader.Read()
            value = If((String.IsNullOrEmpty(reader.Value) OrElse reader.Value.Contains(Environment.NewLine)), "", reader.Value)
            Me.Add(name, value)
        End If
    End While
0 голосов
/ 11 июля 2009

Как насчет использования reader.ReadString () вместо reader.ReadElementString ()? Или, возможно, вместо этого просто используйте reader.Value, чтобы получить значение текущего узла.

0 голосов
/ 11 июля 2009

Попробуйте это (не проверено):

    Do While reader.Read()
            If reader.NodeType = Xml.XmlNodeType.Element Then
                    Me.Add(reader.Name, reader.Value)
            End If
    Loop
...