Mam pod wpływem tego XML Sting:

<?xml version="1.0" encoding="UTF-8"?>
<SR Workstation="0014" Status="Active">
 <OS>
  <Identification Hardware="DELL" SerialNumber="123456789">Confirmed</Identification>
  <CN> EXTERN</CN>
  <CV>1.1.2.45</CV>
  <TS>Idle</TS>
  <TSS>Ok</TSS>
  <ReaderStatus Reader="Icc">Enabled</ReaderStatus>
  <ReaderStatus Reader="MS">Enabled</ReaderStatus>
  <LPS>Unavailable</LPS>
 </OS>
</SR>

Mogę uzyskać dane stacji roboczej i dane statusu za pomocą tego skryptu w VB.NET

Dim sr As New System.IO.StringReader(l_Result.XMLData)
        Dim doc As New Xml.XmlDocument
        doc.Load(sr)
        Dim reader As New Xml.XmlNodeReader(doc)
        While reader.Read()
            Select Case reader.NodeType
                Case Xml.XmlNodeType.Element
                    If reader.Name = "SR" Then
                        If reader.GetAttribute("WorkStation") = "0014" Then
                            txtStatus.Text = reader.GetAttribute("Status")
                            txtSerial.Text = reader.GetAttribute("Identification/SerialNumber")
                            txtHardware.Text = reader.GetAttribute("Identification/Hardware")
                            lblConfirmed.Text = reader.GetAttribute("Identification")
                        End If
                    End If

            End Select
        End While

Ale uzyskanie wartości 123456789 (SerialNumber), Dell (Hardware) i potwierdzony nie działa.

Czy ktoś może mi pomóc? Nie mam żadnych błędów, ale moje pola tekstowe i etykiety pozostają puste.

1
Thomas Dutoit 3 czerwiec 2018, 12:33

3 odpowiedzi

Najlepsza odpowiedź

Korzystanie z VB.net Właściwości osi XML:

Dim x = System.Xml.Linq.XElement.Parse(l_Result.XMLData), e = x...<Identification>
txtStatus.Text = x.@Status
txtSerial.Text = e.@SerialNumber
txtHardware.Text = e.@Hardware
lblConfirmed.Text = e.Value

Do pętli nad elementami:

For Each e In x...<ReaderStatus>
    Debug.Print(e.Value)
    Debug.Print(e.@Reader)
Next
3
Slai 5 czerwiec 2018, 20:50

Musisz użyć Linq do XML. Następnie twój kod jest łatwy:

Dim doc = XDocument.Parse(l_Result.XMLData)

txtStatus.Text = doc.Root.Attribute("Status").Value
txtSerial.Text = doc.Root.Element("OS").Element("Identification").Attribute("SerialNumber").Value
txtHardware.Text = doc.Root.Element("OS").Element("Identification").Attribute("Hardware").Value
lblConfirmed.Text = doc.Root.Element("OS").Element("Identification").Value
1
Enigmativity 5 czerwiec 2018, 00:09

Możesz użyć XML Linq, aby uzyskać potomek:

Imports System.Xml
Imports System.Xml.Linq

Module Module1

    Sub Main()
        Dim doc As New Xml.XmlDocument
        doc.Load(sr)
        Dim reader As New Xml.XmlNodeReader(doc)
        While Not reader.EOF
            If reader.Name <> "SR" Then
                reader.ReadToFollowing("SR")
            End If
            If Not reader.EOF Then
                Dim sr As XElement = XElement.ReadFrom(reader)
                If CType(sr.Attribute("WorkStation"), String) = "0014" Then
                    txtStatus.Text = reader.GetAttribute("Status")

                    txtSerial.Text = CType(sr.Descendants("SerialNumber").FirstOrDefault(), String)
                    txtHardware.Text = CType(sr.Descendants("Hardware").FirstOrDefault(), String)
                    lblConfirmed.Text = CType(sr.Descendants("Identification").FirstOrDefault(), String)

                    Exit While
                End If
            End If
        End While

    End Sub

End Module
0
jdweng 4 czerwiec 2018, 18:07