这是我的 sample.xml 文件。我正在寻找如何读取它的指令,并将所有节点(子节点)中的内容放到DataSet中,并在DataGrid中显示它。我只能读取单个节点(没有子节点)。
我的代码如下:
Private Sub ReadXmlButton_Click() Handles ReadXmlButton.Click
Dim filePath As String = "C:\Path\"
DataSet.ReadXml("C:\Path\sample.xml")
DataGridView1.DataSource = DataSet
DataGridView1.DataMember = "CART_ID"
End Sub
但它只读取没有子节点的头节点(1000,10.05,YES,8,2)。我想在DataGridView中的第一个(和所有)CART_ID
显示所有信息(例如:1000,10.05,A1A,Triangle,10,1,YES,8,2)。
sample.xml中
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<XML_FILE>
<typ>xml</typ>
<ID>
<NR>007</NR>
</ID>
<PERSONAL>
<Surname>John</Surname>
<Name>Smith</Name>
</PERSONAL>
<COUNTRY>
<CName>UK</CName>
</COUNTRY>
<CITY>
<TOWN>
<TOWN_ID>
<PART_ID>
<CART_ID>
<SIMPLE_ID>1000</SIMPLE_ID>
<SIMPLE_AREA_ID>10.05</SIMPLE_AREA_ID>
<PLACE_ID>
<SPECIFIC_ID>
<id>A1A</id>
<name>Triangle</name>
<area>10</area>
<note>1</note>
</SPECIFIC_ID>
</PLACE_ID>
<Control>YES</Control>
<Control_area>8</Control_area>
<Control_rest>2</Control_rest>
</CART_ID>
<CART_ID>
<SIMPLE_ID>2000</SIMPLE_ID>
<SIMPLE_AREA_ID>20.05</SIMPLE_AREA_ID>
<PLACE_ID>
<SPECIFIC_ID>
<id>B1B</id>
<name>Triangle</name>
<area>20</area>
<note>2</note>
</SPECIFIC_ID>
</PLACE_ID>
<Control>YES</Control>
<Control_area>18</Control_area>
<Control_rest>2</Control_rest>
</CART_ID>
</PART_ID>
</TOWN_ID>
</TOWN>
</CITY>
</XML_FILE>
更新: 最后一件事是如何将修改后代(例如 - 手动将SIMPPLE_ID从1000更改为5000等)保存到原始sample.xml文件中?是否可以使用此解决方案,或者我应该寻找其他方式?
答案 0 :(得分:1)
@Artec假设有3件事:
...而不是使用数据集,首先创建一个具有与您需要的数据的节点相对应的属性的类
Public Class CartItem
Public Property Simple_ID As String
Public Property Simple_Area_ID As String
Public Property Place_ID As String
Public Property Place_Name As String
'...
End Class
现在在Form类上,通过XDocument从xml文件中获取数据并创建CartItem列表。
Public Class Form1
Private _CartItems As List(Of CartItem)
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
_CartItems = New List(Of CartItem)
'TODO: Replace ... below with your file location.
BuildCart("...\sample.xml")
DataGridView1.DataSource = _CartItems
End Sub
Private Sub BuildCart(XmlSourcePath As String)
Dim xDoc As XDocument = XDocument.Load(XmlSourcePath)
For Each cartElement As XElement In xDoc.Root.Descendants("CART_ID")
Dim item As New CartItem
With cartElement
item.Simple_Area_ID = .Descendants("SIMPLE_ID").Value
item.Simple_ID = .Descendants("SIMPLE_AREA_ID").Value
item.Place_ID = .Descendants("id").Value
item.Place_Name = .Descendants("name").Value
'...
End With
_CartItems.Add(item)
Next
End Sub
End Class
注意:有几种方法可以读取XML文件,如XMLTextReader;的XMLDocument; XPathDocument中; XMLReader的;等我个人喜欢使用XDocument。如果你想查看其他选项,你必须做一些研究。这完全取决于xml文件的复杂性,您的要求和偏好。
这可以让你走向正确的方向。
答案 1 :(得分:0)
@Artec我没有在最长的时间内使用WinForms,我不确定是否有更简单的方法来确定哪个特定的行和列已更改。现在,我正在寻求最简单和最基本的解决方案,以帮助您找到正确的方向。
首先,由于你的xml结构,我们不能直接将数据集替换回xml。没有办法告诉代码需要深入CART_ID元素的几个级别。因此,我们只是颠倒了加载xml的方法。
使用我之前答案中的相同CartItem类,我们将DataGridView数据集转换为CartItem列表。使用列表的值更新xDoc元素,并将xDocument保存回xml。
distinct_species
您实际上在内存中更改已加载的XDocument的元素并将其重新放回xml文件中。确实可以做很多改进,例如:
但上面的代码可以帮助你开始。