简体   繁体   中英

Error in Arrange XML Node in specific order using VB.net

Sir, I have created an xml file from excel data using VB.net (Datagridview) and getting the XML output but it was not in an desired order. please help me to get the XML output in specific order. Demo Image has been enclosed. My VB.Net Code

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

Employees with same ID has to Close with single Data Node but my output create data node for each row in an excel data. Please help me, Thanks in advance.

Image - Excel Data

Image - XML Error Output

Image - XML Required Output

You xml should have an ID in each row for code below to work. You can also use the Employee Name instead to group the employees, but adding the ID would be better. I used Xml Linq in code below to create the xml file using Group By.

I also assumed the data was coming from a DataTable instead of using the 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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM