-1

これは私の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) なしでヘッド ノードのみを読み取ります。CART_IDDataGridViewで先頭(およびすべて)からすべての情報(例:1000、10.05、A1A、Triangle、10、1、YES、8、2)を表示したい。

私の結果: ここに画像の説明を入力

期待される結果: ここに画像の説明を入力

サンプル.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 ファイルに保存する方法について説明します。このソリューションでそれを行うことは可能ですか、それとも他の方法を探す必要がありますか?

4

2 に答える 2

1

@Artec 3つのことを仮定:

  • カートノードの構造は標準です
  • ノードの名前を知っている
  • DataGridView コントロールがあるため、Windows フォームを使用しています

...データセットを使用する代わりに、まず必要なデータのノードに対応するプロパティを持つクラスを作成します

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

注: XMLTextReader のように xml ファイルを読み取る方法はいくつかあります。XMLDocument; XPathDocument; XMLReader; XDocument を使用するのは私の個人的な好みです。他のオプションをチェックしたい場合は、いくつかの調査を行う必要があります。それはすべて、xml ファイルの複雑さ、要件、好みによって異なります。

これにより、正しい方向に進むはずです。

于 2016-11-12T19:23:49.560 に答える
0

@Artec私はWinFormsを長い間使用していません。変更された特定の行と列を特定する簡単な方法があるかどうかはわかりません。今のところ、私はあなたを正しい方向に導くための最も単純で基本的な解決策を探しています.

まず、xml 構造のため、データセットを xml に直接置き換えることはできません。コードが CART_ID 要素の数レベル深くまで進む必要があることを伝える方法はありません。そのため、xml をロードするアプローチを逆にします。

前の回答と同じ CartItem クラスを使用して、DataGridView データセットを CartItem のリストにキャストします。リストの値で xDoc 要素を更新し、xDocument を xml に保存します。

Public Class Form1

    Private _CartItems As List(Of CartItem)
    'TODO: Replace ... with the file location.
    Private _FilePath As String = "...\source.xml"

    '... Button1_Click and BuildCart in here.

    Private Sub UpdateXmlButton_Click(sender As Object, e As EventArgs) Handles UpdateXmlButton.Click
        _CartItems = DirectCast(DataGridView1.DataSource, List(Of CartItem))
        UpdateXml()
        MessageBox.Show("Update Done.")
    End Sub

    Private Sub UpdateXml()
        Dim xDoc As XDocument = XDocument.Load(_FilePath)
        Dim cartIDs As IEnumerable(Of XElement) = xDoc.Root.Descendants("CART_ID")

        For index As Integer = 0 To cartIDs.Count - 1
            Dim cartElement As XElement = cartIDs.ElementAt(index)
            Dim item As CartItem = _CartItems(index)

            With cartElement
                .Descendants("SIMPLE_ID").Value = item.Simple_Area_ID
                .Descendants("SIMPLE_AREA_ID").Value = item.Simple_ID
                .Descendants("id").Value = item.Place_ID
                .Descendants("name").Value = item.Place_Name
                '...
            End With
        Next

        xDoc.Save(_FilePath)
    End Sub
End Class

実際には、ロードされた XDocument の要素をメモリに変更し、それを xml ファイルに戻しています。次のような多くの改善点があります。

  • 各プロパティを 1 行にコーディングする代わりに、プロパティをループします。これは、リフレクションとディクショナリを組み合わせることで実現できます。
  • 全体を変更するのではなく、変更された要素のみを更新する

しかし、上記のコードから始める必要があります。

于 2016-11-14T03:29:43.560 に答える