Я пробовал так много разных способов заставить это работать, и он просто продолжает загружать первый элемент. Мне нужно иметь возможность заполнять различные текстовые поля всеми элементами из файла XML после сопоставления текста из поля со списком.
По сути, я загружаю свое приложение, Я СНАЧАЛА читаю XML-файл, чтобы загрузить ComboBox, затем, когда я выбираю элемент из ComboBox, я загружаю другие текстовые поля с подробностями об ошибке.
Мой файл XML:
<?xml version = "1.0" encoding = "us-ascii"?>
<!--SIP Data created by TECH on 1/24/2014 10:07:04 AM-->
<ERROR_ITEMS>
<ERROR_DATA Posted = "6/11/2018 12:00:00 PM">
<Response>ERROR001</Response>
<Method>ErrorCode001</Method>
<Request>Acknowledged</Request>
<Code>001</Code>
<Information>Information for code 001 goes here</Information>
<Troubleshooting>Error 001 designates connections failed. Check all connections.</Troubleshooting>
<Additional_Notes>Tech notes: Ensure proper gauge of wiring.</Additional_Notes>
<DateTimeSaved>11/10/2014 1:45:25 PM</DateTimeSaved>
<Response>ERROR002</Response>
<Method>ErrorCode002</Method>
<Request>Acknowledged</Request>
<Code>002</Code>
<Information>Information for code 002 goes here</Information>
<Troubleshooting>Error 002 designates input power failed. Check power to aux inputs.</Troubleshooting>
<Additional_Notes>Tech notes: Check all power connections</Additional_Notes>
<DateTimeSaved>11/10/2014 1:50:25 PM</DateTimeSaved>
</ERROR_DATA>
</ERROR_ITEMS>
И мой код VB.net:
Imports System.Xml
Imports System.Text
Imports System.IO
Imports System.Environment
Public Class Form1
Private Sub ExitAppBTN_Click(sender As Object, e As EventArgs) Handles ExitAppBTN.Click
Me.Close()
End Sub
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Try
' LOAD THE ERRORS INTO THE COMBO BOX
Dim document As XmlDocument = New XmlDocument
document.Load(Application.StartupPath & "/items.xml")
For Each node In document.SelectNodes("ERROR_ITEMS/ERROR_DATA/Response")
CmboERRORList.Items.Add(node.InnerText())
Next
'Load First Item
CmboERRORList.SelectedIndex = 0
CmboERRORList.Focus()
Catch ex As Exception
MsgBox("Error processing file. The error was: " & vbCrLf & Err.Description, MsgBoxStyle.Exclamation, "Error loading file contents to drop down list.")
End Try
End Sub
Private Sub CmboERRORList_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CmboERRORList.SelectedIndexChanged
Try
'Load info from the XML file
Dim document As XmlDocument = New XmlDocument
document.Load(Application.StartupPath & "/items.xml")
Dim node = document.SelectSingleNode("ERROR_ITEMS/ERROR_DATA[Response = '" & CmboERRORList.Text & "']")
MsgBox(node.SelectSingleNode("Method").InnerText)
For Each node In document.SelectNodes("ERROR_ITEMS/ERROR_DATA[Response = '" & CmboERRORList.Text & "']")
Dim ErrResponseCode = node.SelectSingleNode("Method").InnerText
Dim ErrDetails = node.SelectSingleNode("Information").InnerText
txtDetails.Text = ErrDetails
Next
Catch ex As Exception
MsgBox("Error Reading Error Data File, please contact technical support. Error is: " & Err.Description & vbCrLf & "Error Number is :" & Err.Number, MsgBoxStyle.Exclamation, "Error")
End Try
End Sub
Ага. Пользуюсь этим годами, но ни разу не искал. Обычно у меня был один XML-файл для каждого элемента, но теперь я хочу использовать только один.





Используйте это вместо вашего текущего обработчика событий ComboBox SelectedIndexChanged.
Private Sub CmboERRORList_SelectedIndexChanged(sender As Object, e As EventArgs) Handles CmboERRORList.SelectedIndexChanged
Try
'Load info from the XML file
Dim settings As New XmlReaderSettings()
settings.DtdProcessing = DtdProcessing.Parse
Dim reader As XmlReader = XmlReader.Create("XmlFile1.xml", settings)
Dim found As Boolean = False
Dim nodeName As String = String.Empty
Dim nodeText As String = String.Empty
While reader.Read
Select Case reader.NodeType
Case XmlNodeType.Element
nodeName = reader.Name
Case XmlNodeType.Text
nodeText = reader.Value
End Select
If (nodeName = "Response" AndAlso nodeText = CmboERRORList.Text) Then
found = True
End If
If (found AndAlso nodeName = "Method" AndAlso reader.NodeType = XmlNodeType.Text) Then
Debug.WriteLine("Method = " & reader.Value)
ElseIf (found AndAlso nodeName = "Request" AndAlso reader.NodeType = XmlNodeType.Text) Then
Debug.WriteLine("Request = " & reader.Value)
ElseIf (found AndAlso nodeName = "Code" AndAlso reader.NodeType = XmlNodeType.Text) Then
Debug.WriteLine("Code = " & reader.Value)
ElseIf (found AndAlso nodeName = "Information" AndAlso reader.NodeType = XmlNodeType.Text) Then
Debug.WriteLine("Information = " & reader.Value)
txtDetails.Text = reader.Value
ElseIf (found AndAlso nodeName = "Troubleshooting" AndAlso reader.NodeType = XmlNodeType.Text) Then
Debug.WriteLine("Troubleshooting = " & reader.Value)
ElseIf (found AndAlso nodeName = "Additional_Notes" AndAlso reader.NodeType = XmlNodeType.Text) Then
Debug.WriteLine("Additional_Notes = " & reader.Value)
ElseIf (found AndAlso nodeName = "DateTimeSaved" AndAlso reader.NodeType = XmlNodeType.Text) Then
Debug.WriteLine("DateTimeSaved = " & reader.Value)
Exit While
End If
End While
Catch ex As Exception
MsgBox("Error Reading Error Data File, please contact technical support. Error is: " & Err.Description & vbCrLf & "Error Number is :" & Err.Number, MsgBoxStyle.Exclamation, "Error")
End Try
End Sub
Здесь я использую класс XmlReader для построчного чтения Xml. Если ваш XML-документ не является иерархическим, то XmlReader - действительно лучший вариант для его просмотра.
XmlReader (Ссылка на MSDN) очень низкоуровневый, что означает, что вам нужно проверять, что вы читаете, на каждом этапе и действовать соответственно. Дополнительная информация о методе Read и работе с NodeTypes
Обратите внимание, что я помещаю Exit While в последний Else..If оператор для завершения цикла While, поскольку узел DateTimeSaved является последним, который вас интересует
БАМ! Идеально. Спасибо!
Действительно ли ваш XML-код похож на предоставленный вами образец? Это не выглядит иерархической, это очень плоская структура. Эта структура не будет эффективно прочитана с помощью класса XmlDocument, для этого вам нужно использовать XmlReader.