繁体   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