[英]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數據中的每一行創建了一個數據節點。 請幫助我,在此先謝謝。
您的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.