2015-10-06 6 views
1

Я пытаюсь создать цикл, который читает XML-документ для элемента с определенным номером идентификатора, а затем сохраняет дочерние узлы этого элемента как переменные, которые затем используются для заполнения ярлыков на моей странице ,XmlTextReader не работает должным образом

Sub LinkButton_Click(sender As Object, e As CommandEventArgs) 
    Dim selected = Convert.ToInt32(e.CommandArgument) 
    System.Diagnostics.Debug.WriteLine("selected") 
    System.Diagnostics.Debug.WriteLine (selected) 

    Dim selectedXML = New XmlTextReader(MapPath("xml/questions.xml")) 

    selectedXML.ReadToFollowing("Question") 
    If selectedXML.HasAttributes Then 
     selectedXML.MoveToNextAttribute() 

     Do While selectedXML.MoveToNextAttribute() 

      Dim compareID = selectedXML.Value 
      System.Diagnostics.Debug.WriteLine("compareID:") 
      System.Diagnostics.Debug.WriteLine(compareID) 

      If compareID = selected Then 
       selectedXML.ReadToFollowing("A") 
       sA.Text = selectedXML.Value 
       System.Diagnostics.Debug.WriteLine("SA:") 
       System.Diagnostics.Debug.WriteLine(sA.Text) 

       selectedXML.ReadToFollowing("Q") 
       sQ.Text = selectedXML.Value 
       System.Diagnostics.Debug.WriteLine("SQ:") 
       System.Diagnostics.Debug.WriteLine(sQ.Text) 

       selectedXML.ReadToFollowing("Download") 
       sDL.Text = selectedXML.Value 
       System.Diagnostics.Debug.WriteLine("SDL:") 
       System.Diagnostics.Debug.WriteLine(sDL.Text) 

       selectedXML.Close() 
      Else 
       selectedXML.ReadToNextSibling("Question") 
      End If 
     Loop 
    Else 
     System.Diagnostics.Debug.WriteLine("error") 
     selectedXML.Close() 
    End If 

End Sub 

XML Document (избыточные узлы ID используются в получении идентификационного номера, но в конечном итоге будут устранены. Текущий код выглядит только для атрибута «ID». Это возможно потому, что он чувствителен к регистру)

<?xml version="1.0" encoding="utf-8" ?> 
<Questions> 

    <Question id="1"> 
    <ID>1</ID> 
    <Category>Troubleshooting</Category> 
    <Keywords>tags troubleshooting troubleshoot slow computer slowly</Keywords> 
    <Q>Why is my computer so slow?</Q> 
    <A>You have bad habits and your computer sucks</A> 
    <Download>None.</Download> 
    </Question> 

    <Question id="2"> 
    <ID>2</ID> 
    <Category>Troubleshooting</Category> 
    <Keywords>tags troubleshooting troubleshoot slow computer slowly</Keywords> 
    <Q>Why is my computer so slow? (again)</Q> 
    <A>You have bad habits and your computer sucks</A> 
    <Download>None.</Download> 
    </Question> 

    <Question id="3"> 
    <ID>3</ID> 
    <Category>Microsoft Office</Category> 
    <Keywords>tags microsoft office outlook calendar room rooms meeting schedule scheduling reserving reserve</Keywords> 
    <Q>How do I reserve rooms and set up meetings?</Q> 
    <A>View the following Document:</A> 
    <Download><![CDATA[<a href="doc/new_employee/new_employee_agreement.doc">New Employee Software and Hardware Agreement</a>]]></Download> 
    </Question> 

</Questions> 

Кнопочная кнопка передала переменную «выбрана» как контрольная сумма. В моей консоли я вижу, что это работает правильно. т.е. нажмите первый элемент, который автоматически устанавливает «выбранный» в 1. Когда у меня возникают проблемы с чтением XML и передачей атрибута id в качестве переменной compareID. Независимо от того, что я делаю, я, кажется, всегда получаю compareID=0.

Во-вторых, цикл работает бесконечно. Как я могу запрограммировать считыватель, чтобы он остановился, когда он достигнет конца документа после нахождения совпадений.

ответ

0

Используйте Using Statement, чтобы автоматически закрыть XmlReader даже в случае исключений.

Do неXmlTextReader класс, не рекомендуется начинать с .NET Framework 2.0. Вместо этого используйте XmlReader.

Обратите внимание, что мы должны обратиться к узлам Q, A и Download в том порядке, в котором они расположены в XML-документе.

Упрощенный код:

Using selectedXML = XmlReader.Create(MapPath("xml/questions.xml")) 
    While selectedXML.ReadToFollowing("Question") ' Iterates through Question nodes. 

     Dim compareID = selectedXML.GetAttribute("id") 

     If compareID IsNot Nothing Then     
      Debug.WriteLine("compareID: " + compareID) 

      If compareID = selected Then 
       selectedXML.ReadToFollowing("Q") 
       sQ.Text = selectedXML.ReadElementContentAsString 
       Debug.WriteLine("SQ: " + sQ.Text) 

       selectedXML.ReadToFollowing("A") 
       sA.Text = selectedXML.ReadElementContentAsString 
       Debug.WriteLine("SA: " + sA.Text) 

       selectedXML.ReadToFollowing("Download") 
       sDL.Text = selectedXML.ReadElementContentAsString 
       Debug.WriteLine("SDL: " + sDL.Text) 

       Exit While 
      End If 
     Else 
      Debug.WriteLine("Error: attribute id not found") 
     End If 

    End While 
End Using ' Close XmlReader 
+0

Работает отлично! Спасибо – MRG

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