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>,仅处理<cmd>此示例中的元素,而不是<comment>元素。所以如果在列表框中选择了Set 1,我只想处理文本“Command 1”和“Command 2”。

有人建议我给元素一个 ID 或名称会使事情变得更容易,但我想尽可能避免这种情况,因为我希望最终用户可以编辑 XML(有时不是很技术)所以我试图让事情变得简单尽可能。

我尝试了各种不同的想法,但无济于事,我是 XML 新手(从 SO 获得了填充列表框的代码),所以如果到目前为止我所做的任何事情都是不好的做法,请大喊大叫。

4

1 回答 1

1

是的,如果您正在查看的值在属性或子元素中,这样做会更容易,但仍然可以这样做。这将遍历包含 textcmd的所有值:cmdsetSet 1

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

方括号建立了一个条件,因此只有条件为真的元素才会被包括在内。该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 回答