1

XMLの例;

<root>
 <cmdset>Set 1
     <comment>Comment 1 here.</comment>
     <cmd>Command 1</cmd>
     <cmd>Command 2</cmd>
 </cmdset>

 <cmdset>Set 2
     <comment>Comment 2 here.</comment>
     <cmd>Command 3</cmd>
     <cmd>Command 4</cmd>
 </cmdset>
</root>

現在、<cmdset>要素を設定するリストボックスがあります。コードは;

    Dim doc As XmlDocument = New XmlDocument()
    doc.Load("help.xml")
    For Each textNode As XmlText In doc.SelectNodes("//cmdset/text()")
        listCmdSet.Items.Add(textNode.InnerText)
    Next

リストボックスに出力するもの。

Set 1
Set 2

ここで、特定の要素内の特定の子要素を処理できるようにしたいのですが、この例<cmdset>の要素のみを処理でき、要素は処理できません。したがって、リストボックスで[セット1]が選択されている場合は、「コマンド1」と「コマンド2」というテキストのみを処理します。<cmd><comment>

要素にIDまたは名前を付けると簡単になるとアドバイスされていますが、エンドユーザーがXMLを編集できるようにするため(技術的ではない場合もあります)、可能な限りこれを避けたいので、物事をシンプルに保つようにしています。できるだけ。

私はさまざまなアイデアを試しましたが、役に立たなかったので、XMLを初めて使用しました(SOからリストボックスにデータを入力するコードを取得しました)。

4

1 に答える 1

1

はい、見ている値が属性または子要素にある場合は簡単に実行できますが、それでも可能です。これは、 text を含む のすべてのcmd値をループします。cmdsetSet 1

For Each node As XmlNode In doc.SelectNodes("//cmdset[normalize-space(text())='Set 1']/cmd")
    Dim value As String = node.InnerText
    ' ...
Next

角かっこは条件を確立するため、その条件が true である要素のみが含まれます。このnormalize-space関数は、テキストの後の改行を取り除くためにテキストを本質的にトリミングするために必要です。

ただし、それがまさにあなたが求めているものであるかどうかは、あなたの質問からは少しわかりません。目的の親要素への参照が既にある場合は、次のように簡単に実行できます。

Dim cmdsetElement As XmlElement = ' ...
For Each node As XmlNode in cmdsetElement.SelectNodes("cmd")
    Dim value As String = node.InnerText
    ' ...
Next
于 2013-02-22T21:05:33.920 に答える