从特定父元素中读取某些子元素

时间:2013-02-22 20:50:15

标签: xml vb.net parent-child

示例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填充列表框的代码)所以如果我到目前为止所做的任何事情都是不好的做法,请大声说出来。

1 个答案:

答案 0 :(得分:1)

是的,如果您正在查看的值位于属性或子元素中,那么这样做会更容易,但仍然可以这样做。这将循环显示包含文本cmd的{​​{1}}的所有cmdset值:

Set 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