簡體   English   中英

使用VB.net按特定順序排列XML節點時出錯

[英]Error in Arrange XML Node in specific order using VB.net

先生,我已經使用VB.net(Datagridview)從excel數據創建了一個xml文件,並獲取了XML輸出,但是它的順序不理想。 請幫助我以特定順序獲取XML輸出。 演示圖像已隨附。 我的VB.Net代碼

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    Dim doc As New XmlDocument, xslDoc As New XmlDocument, newDoc As New XmlDocument
    Dim root As XmlElement
    Dim dataNode As XmlElement
    Dim subdataNode As XmlElement
    Dim attribNode As XmlElement

    ' DECLARE XML DOC OBJECT '
    root = doc.CreateElement("SMCH")
    doc.AppendChild(root)

    Dim rowIndex As Int32 = 0
    Dim colIndex As Int32 = 0

    ' WRITE TO XML '
    ' In case you want the first column selected. 
    ' DATA NODE '

    For rowIndex = 0 To DataGridView1.RowCount - 1
        If DataGridView1.Rows(rowIndex).Cells("ID").Value IsNot Nothing Then

            dataNode = doc.CreateElement("Data")
            root.AppendChild(dataNode)
            ' OUTER ATTRIBUTE NODE '
            attribNode = doc.CreateElement("ID")
            dataNode.AppendChild(attribNode)
            attribNode.InnerText = DataGridView1.Rows(rowIndex).Cells("ID").Value.ToString
            ' SUB DATA NODE '
            subdataNode = doc.CreateElement("EMPLOYEE")
            dataNode.AppendChild(subdataNode)
            ' ATTRIBUTE NODE '
            attribNode = doc.CreateElement("EMPLOYEENAME")
            subdataNode.AppendChild(attribNode)
            attribNode.InnerText = DataGridView1.Rows(rowIndex).Cells("NAME").Value.ToString
            ' ATTRIBUTE NODE '
            attribNode = doc.CreateElement("GRADEMONTH")
            subdataNode.AppendChild(attribNode)
            attribNode.InnerText = DataGridView1.Rows(rowIndex).Cells("MONTH").Value.ToString
            ' ATTRIBUTE NODE '
            attribNode = doc.CreateElement("GRADE")
            subdataNode.AppendChild(attribNode)
            attribNode.InnerText = DataGridView1.Rows(rowIndex).Cells("GRADE").Value.ToString
        Else
            ' SUB DATA NODE '
            subdataNode = doc.CreateElement("EMPLOYEE")
            dataNode.AppendChild(subdataNode)
            ' ATTRIBUTE NODE '
            attribNode = doc.CreateElement("EMPLOYEENAME")
            subdataNode.AppendChild(attribNode)
            attribNode.InnerText = DataGridView1.Rows(rowIndex).Cells("NAME").Value.ToString
            ' ATTRIBUTE NODE '
            attribNode = doc.CreateElement("GRADEMONTH")
            subdataNode.AppendChild(attribNode)
            attribNode.InnerText = DataGridView1.Rows(rowIndex).Cells("MONTH").Value.ToString
            ' ATTRIBUTE NODE '
            attribNode = doc.CreateElement("GRADE")
            subdataNode.AppendChild(attribNode)
            attribNode.InnerText = DataGridView1.Rows(rowIndex).Cells("GRADE").Value.ToString
        End If

    Next rowIndex

    ' PRETTY PRINT RAW OUTPUT '
    xslDoc.LoadXml("<?xml version=" & Chr(34) & "1.0" & Chr(34) & "?>" _
            & "<xsl:stylesheet version=" & Chr(34) & "1.0" & Chr(34) _
            & "                xmlns:xsl=" & Chr(34) & "http://www.w3.org/1999/XSL/Transform" & Chr(34) & ">" _
            & "<xsl:strip-space elements=" & Chr(34) & "*" & Chr(34) & " />" _
            & "<xsl:output method=" & Chr(34) & "xml" & Chr(34) & " indent=" & Chr(34) & "yes" & Chr(34) & " omit-xml-declaration=" & Chr(34) & "yes" & Chr(34) & "/>" _
            & " <xsl:template match=" & Chr(34) & "node() | @*" & Chr(34) & ">" _
            & "  <xsl:copy>" _
            & "   <xsl:apply-templates select=" & Chr(34) & "node() | @*" & Chr(34) & " />" _
            & "  </xsl:copy>" _
            & " </xsl:template>" _
            & "</xsl:stylesheet>")


    doc.Save("C:\Users\Admin\Desktop\TXML.xml")
End Sub

具有相同ID的員工必須使用單個數據節點關閉,但是我的輸出為Excel數據中的每一行創建了一個數據節點。 請幫助我,在此先謝謝。

圖像-Excel數據

圖像-XML錯誤輸出

圖像-XML必需的輸出

您的xml應該在每行中都有一個ID,以便下面的代碼起作用。 您也可以使用Employee Name來對員工進行分組,但是添加ID會更好。 我在下面的代碼中使用Xml Linq使用Group By創建xml文件。

我還假設數據來自DataTable,而不是使用DataGridView。

Imports System.Data
Imports System.Xml
Imports System.Xml.Linq
Module Module1

    Sub Main()
        Dim dt As New DataTable()

        dt.Columns.Add("ID", GetType(Integer))
        dt.Columns.Add("NAME", GetType(String))
        dt.Columns.Add("MONTH", GetType(String))
        dt.Columns.Add("GRADE", GetType(String))

        dt.Rows.Add(New Object() {1, "SATHISH", "April", "A1"})
        dt.Rows.Add(New Object() {1, "SATHISH", "May", "C1"})
        dt.Rows.Add(New Object() {1, "SATHISH", "June", "B3"})
        dt.Rows.Add(New Object() {2, "PREMKUMAR", "April", "B1"})
        dt.Rows.Add(New Object() {2, "PREMKUMAR", "May", "D3"})
        dt.Rows.Add(New Object() {3, "PREMKUMAR", "April", "A1"})
        dt.Rows.Add(New Object() {3, "PREMKUMAR", "May", "C3"})

        Dim groups = dt.AsEnumerable().GroupBy(Function(x) x.Field(Of Integer)("ID")).ToList()

        Dim smch As New XElement("SMCH")

        For Each group In groups
            Dim data As New XElement("Data")
            smch.Add(data)
            data.Add(New XElement("ID", group.First().Field(Of Integer)("ID")))

            For Each row As DataRow In group
                Dim employee As New XElement("EMPLOYEE", New Object() { _
                    New XElement("EMPLOYEENAME", row.Field(Of String)("NAME")), _
                    New XElement("GRADEMONTH", row.Field(Of String)("MONTH")), _
                    New XElement("GRADE", row.Field(Of String)("GRADE")) _
                })
                data.Add(employee)
            Next row
        Next group

    End Sub

End Module

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM