Чтение XML-файла с использованием VB.NET - PullRequest
0 голосов
/ 20 сентября 2019

Мне нужно какое-то направление, где искать при чтении файлов XML

Мне было поручено взять приведенный ниже файл XML (сокращенная версия для этого)

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<CompositeDoors>
    <CompositeDoor  
        AddOnLeft1="[] Eurocell door 15mm" 
        AddOnLeft1_Code="b95e1973f58e747b3e4f7d251097fe9d">
        <Door 
            CylinderType="[ZL30-30NAS] base Standard Satin Chrome Cylinder [Nickel]" 
            CylinderType_Code="112b68d790bc50a835e1c1b1589e57a0" 
        />
    </CompositeDoor>
    <Sidelights>
        <Sidelight 
            Coupler="Eurocell window Coupler" 
            Coupler_Code="03f7f14d5d3484f61fab9fd15239a3e0" 
        />
        <Sidelight
            ArgonGas="Argon Gas" 
            ArgonGas_Code="No" 
            Coupler="Eurocell window Coupler" 
            Coupler_Code="03f7f14d5d3484f61fab9fd15239a3e0" 
        />
    </Sidelights>
    <Topbox 
        ArgonGas="Argon Gas" 
        ArgonGas_Code="No" 
        Glazed="Yes" 
        TopboxDrop="380" 
    />
</CompositeDoors>

и преобразовать егов XML-файл может прочитать другая программа (что-то вроде этого)

<?xml version="1.0" encoding="utf-8" ?>
<order>
<Header>
    <customer_code>3080</customer_code>
    <del._Name></del._Name>
    <Del._Address_1>Unit 1, </Del._Address_1>
</Header>
<Frame_1>
    <Quantity>1</Quantity>
    <Overall_Width>950</Overall_Width>
    <Overall_Height>2050</Overall_Height>
</Frame_1>
<Frame_2>
    <Quantity>1</Quantity>
    <Overall_Width>950</Overall_Width>
    <Overall_Height>2050</Overall_Height>   
</Frame_2>
<Frame_3>
    <Quantity>1</Quantity>
    <Overall_Width>950</Overall_Width>
    <Overall_Height>2050</Overall_Height>
</Frame_3>
<Frame_4>
    <Quantity>1</Quantity>
    <Overall_Width>950</Overall_Width>
    <Overall_Height>2050</Overall_Height>
</Frame_4>

</order>

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

While reader.Read()
    ' Check for start elements. '
    If reader.IsStartElement() Then
        If reader.Name = "CompositeDoors" Then
        ElseIf reader.Name = "CompositeDoor" Then
            lbHD_customer_code.InnerText = reader("CustomerAccountCode")
        ElseIf reader.Name = "Sidelight" Then
        For Each m_node In m_nodelist
            framenumber = framenumber + 1
            If framenumber = 1 Then

, если кто-то может помочь, это было бы фантастически, но даже толчок в правильном направлении был бы очень признателен

Ответы [ 2 ]

0 голосов
/ 26 сентября 2019

это не полный код, так как он содержит около 300 строк, но именно так я и достиг своего решения, каждый узел проверяется на соответствие массиву, чтобы увидеть, нужно ли мне его использовать, а затем выделяет кадр для каждого раздела

зацикливаясь на xml, я чувствую, как он обходит дома, но это дает мне мой результат

  Dim m_nodelist As XmlNodeList
    Dim m_xmld As XmlDocument
    m_xmld = New XmlDocument
    Dim framenumber As Int16 = 0
    Dim tags() As String = {"CompositeDoor", "Door", "Sidelight", "Topbox"}
    Dim txt As String = ""
    ' Create an XML reader.
    Using reader As XmlReader = XmlReader.Create(File)
        m_xmld.Load(File)
        m_nodelist = m_xmld.GetElementsByTagName("Sidelight")
        While reader.Read()
            ' Check for start elements.

            If reader.IsStartElement() Then
                ' See if perls element or article element.
                '  MsgBox(reader.Name)

                If tags.Contains(reader.Name) Then

                    If reader.Name = "Topbox" Then
                        framenumber = 4
                    End If

                    If framenumber = 0 Then

                        Header.Visible = True
                        ' Header Info
                        lbHD_customer_code.InnerText = reader("CustomerAccountCode")
                        lbHD_del_Name.InnerText = reader("Delivery_Reference")
                        lbHD_Del_Address_1.InnerText = reader("Delivery_Address1")
                        lbHD_Del_Address_2.InnerText = reader("Delivery_Address2")
                        lbHD_Del_Address_3.InnerText = reader("Delivery_County")
 End If
            End If
        End While
    End Using
0 голосов
/ 20 сентября 2019

WOW!Трудно увидеть отношения между ними.Вот фрагмент кода, который может помочь вам начать.Фрагмент содержит две ссылки, которые вы должны прочитать.

'
'read about 
'XElement Class
' https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xelement?view=netframework-4.8
'Xml literals
' https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/xml-literals/xml-element-literal
'
Dim inxe As XElement
'to load from file
' inxe = XElement.Load("path to file")
'for testing
inxe = <CompositeDoors>
           <CompositeDoor
               AddOnLeft1="[] Eurocell door 15mm"
               AddOnLeft1_Code="b95e1973f58e747b3e4f7d251097fe9d">
               <Door
                   CylinderType="[ZL30-30NAS] base Standard Satin Chrome Cylinder [Nickel]"
                   CylinderType_Code="112b68d790bc50a835e1c1b1589e57a0"
               />
           </CompositeDoor>
           <Sidelights>
               <Sidelight
                   Coupler="Eurocell window Coupler"
                   Coupler_Code="03f7f14d5d3484f61fab9fd15239a3e0"
               />
               <Sidelight
                   ArgonGas="Argon Gas"
                   ArgonGas_Code="No"
                   Coupler="Eurocell window Coupler"
                   Coupler_Code="FOOOOOOOOO03f7f14d5d3484f61fab9fd15239a3e0"
               />
           </Sidelights>
           <Topbox
               ArgonGas="Argon Gas"
               ArgonGas_Code="No"
               Glazed="Yes"
               TopboxDrop="380"
           />
       </CompositeDoors>

Stop 'step through the code
Dim framePROTO As XElement = <Frame id=""></Frame>
Dim frameID As Integer = 1
Dim outxe As XElement = <order></order>
For Each el As XElement In inxe...<Sidelight>
    Dim newFrame As New XElement(framePROTO)
    newFrame.@id = frameID.ToString
    frameID += 1
    Dim itm As XElement = <itm><%= el.@Coupler %></itm>
    itm.@code = el.@Coupler_Code
    newFrame.Add(itm)
    outxe.Add(newFrame)
Next
Stop '  examine outxe
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...