[英]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.