我有这个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
答案 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