带有相同标签的vb.net XML

时间:2018-02-17 18:48:47

标签: xml vb.net

我有这个XML:

<results start="1" max="-1">
  <result id="c32d93ab-8c3f-4af4-abfd-cb6d4887fcf0">
    <name>name1</name>
    <owner>
      <name>admin</name>
    </owner>

    <detection>
      <result id="54fb1b7b-fc21-4057-abeb-c414f17b89ba">
        <details>
          <detail>
            <name>product name</name>
          </detail>
        </details>
      </result>
    </detection>
    </result>
  <result id="c32d93ab-8c3f-4af4-abfd-cb6d4887fcf1">
    <name>name2</name>
    <owner>
      <name>admin</name>
    </owner>

    <detection>
      <result id="54fb1b7b-fc21-4057-abeb-c414f17b89bb">
        <details>
          <detail>
            <name>product name2</name>
          </detail>
        </details>
      </result>
    </detection>
  </result>
</results>

这是我必须解析的XML的一个粗略示例。我编写了以下代码,现在我只想在每组数据中获取第一个名称,所以在这种情况下我想抓住&#34; name1&#34;和&#34; name2&#34;问题是结果标记在XML中以不同的方式在顶部使用两次,一次在检测标记内。因此,当我的代码运行时,我得到&#34; name1&#34;返回第一个msgbox,然后下一个msgbox是空白的,因为它似乎抓住了检测内部的下一个结果而不是下降到下一个结果。有没有办法告诉它不要进入检测标签,所以它不会抓住这个结果,或者只是有一个更好的方法来解决这个问题?这是我的代码:

    xmldoc = "*.xml"

    Do While xmldoc <> ""
        Dim xdocument As XDocument = XDocument.Load(sDir & xmldoc)

        'Get results
        Dim results = xdocument.Descendants("result")
        For Each result As XElement In results
            Dim sName = result.Element("name")
            MsgBox(sName, vbOKOnly, "Debug-sName")
        Next result
    Loop

1 个答案:

答案 0 :(得分:0)

我更新了您的xml帖子以修复xml文件,使其有效。这是使用Xml linq的解决方案:

Imports System.Xml
Imports System.Xml.Linq

Module Module1
    Const FILENAME As String = "c:\temp\test.xml"
    Sub Main()
        Dim doc As XDocument = XDocument.Load(FILENAME)

        Dim results = doc.Descendants("results").Elements("result").Select(Function(x) New With { _
                .id = x.Attribute("id"), _
                .name = x.Element("name").Value,
                .owner = x.Element("owner").Element("name").Value,
                .detectionId = x.Descendants("result").FirstOrDefault().Attribute("id").Value,
                .detection = x.Element("detection").Descendants("name").Select(Function(y) y.Value).FirstOrDefault()
            }).ToList()
    End Sub

End Module