将xml节点读取到数据集,编辑后代的值并保存(Visal Studio) - 重新打开

时间:2016-11-12 13:58:59

标签: xml vb.net nodes readxml

这是我的 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)。

我的结果: enter image description here

预期结果: enter image description here

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文件中?是否可以使用此解决方案,或者我应该寻找其他方式?

2 个答案:

答案 0 :(得分:1)

@Artec假设有3件事:

  • 购物车节点的结构是标准的
  • 您知道节点的名称
  • 您使用的是Windows Form,因为您拥有DataGridView控件

...而不是使用数据集,首先创建一个具有与您需要的数据的节点相对应的属性的类

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文件中。确实可以做很多改进,例如:

  • 循环遍历属性,而不是对一行中的每个属性进行编码。这可以通过反射和字典的组合来实现。
  • 仅更新已更改的元素,而不是更改整个内容

但上面的代码可以帮助你开始。