简体   繁体   English

使用VB.net按特定顺序排列XML节点时出错

[英]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. 先生,我已经使用VB.net(Datagridview)从excel数据创建了一个xml文件,并获取了XML输出,但是它的顺序不理想。 please help me to get the XML output in specific order. 请帮助我以特定顺序获取XML输出。 Demo Image has been enclosed. 演示图像已随附。 My VB.Net Code 我的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

Employees with same ID has to Close with single Data Node but my output create data node for each row in an excel data. 具有相同ID的员工必须使用单个数据节点关闭,但是我的输出为Excel数据中的每一行创建了一个数据节点。 Please help me, Thanks in advance. 请帮助我,在此先谢谢。

Image - Excel Data 图像-Excel数据

Image - XML Error Output 图像-XML错误输出

Image - XML Required Output 图像-XML必需的输出

You xml should have an ID in each row for code below to work. 您的xml应该在每行中都有一个ID,以便下面的代码起作用。 You can also use the Employee Name instead to group the employees, but adding the ID would be better. 您也可以使用Employee Name来对员工进行分组,但是添加ID会更好。 I used Xml Linq in code below to create the xml file using Group By. 我在下面的代码中使用Xml Linq使用Group By创建xml文件。

I also assumed the data was coming from a DataTable instead of using the DataGridView. 我还假设数据来自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