我的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<DisksLibrary>
<Disk>
<DiskName>Test</DiskName>
<DiskPath>testpath</DiskPath>
</Disk>
<Disk>
<DiskName>Test1</DiskName>
<DiskPath>testpath1</DiskPath>
</Disk>
<Disk>
<DiskName>Test2</DiskName>
<DiskPath>testpath2</DiskPath>
</Disk>
</DisksLibrary>
我想知道因为我有多个具有相同名称的标签,例如在My XML文件中,是否可以从XML文件中检索特定的数据集?例如,如果我想要检索与InnerText为“Test”的设置相同的DiskPath innertext。换句话说,我应检索的DiskPath是“testpath1”。如何确保它不会与其他DiskPath innertext混淆?
我尝试在线搜索但是没有提供解决方案或提供的解决方案对我不起作用。我找到了一个似乎有效的解决方案,但在阅读完代码后,如果有多个具有相同名称的标签,我认为它不起作用。
我发现的解决方案我不确定它是否解决了我的问题:
Dim document As XmlReader = New XmlTextReader("MyXML.xml")
While (document.Read())
Dim type = document.NodeType
If (type = XmlNodeType.Element) Then
If (document.Name = "FirstName") Then
TextBox1.Text = document.ReadInnerXml.ToString()
End If
If (document.Name = "LastName") Then
TextBox2.Text = document.ReadInnerXml.ToString()
End If
End If
End While
感谢您的帮助。欣赏它。
答案 0 :(得分:1)
阅读有关XPath和 Predicates (http://www.w3schools.com/xpath/xpath_syntax.asp)对您非常有用。在您的实例中,您希望返回其兄弟“DiskName”的值为“Test”的任何“DiskPath”元素的内部文本。正如Styxxy描述的那样,XPath /DisksLibrary/Disk[DiskName="Test"]/DiskPath
将实现这一目标:
Dim doc As New XmlDocument
Dim targetPath As String
doc.Load("MyXML.xml")
Dim foundNode As XmlNode = doc.SelectSingleNode("/DisksLibrary/Disk[DiskName='Test']/DiskPath")
If Not (foundNode Is Nothing) Then
targetPath = foundNode.InnerText
End If
答案 1 :(得分:1)
我会考虑参数化XPath方法以使其可扩展。
Imports System.Xml
Module Module1
Sub Main()
Dim xml As String = _
"<?xml version=""1.0"" encoding=""utf-8""?>" & _
"<DisksLibrary>" & _
" <Disk>" & _
" <DiskName>Test1</DiskName>" & _
" <DiskPath>testpath1</DiskPath>" & _
" </Disk>" & _
" <Disk>" & _
" <DiskName>Test2</DiskName>" & _
" <DiskPath>testpath2</DiskPath>" & _
" </Disk>" & _
" <Disk>" & _
" <DiskName>Test3</DiskName>" & _
" <DiskPath>testpath3</DiskPath>" & _
" </Disk>" & _
"</DisksLibrary>"
Dim doc As New XmlDocument
doc.LoadXml(xml)
For i = 1 To 4
Dim foundNode = FindSiblingNode(doc, "Test" & i, "DiskPath")
Console.WriteLine(If(Not foundNode Is Nothing, foundNode.InnerText, "Node not found"))
Next
Console.ReadLine()
End Sub
Public Function FindSiblingNode(ByVal doc As XmlDocument, _
ByVal siblingNodeInnerText As String, _
ByVal searchNodeName As String) As XmlNode
Return doc.SelectSingleNode(String.Format("/DisksLibrary/Disk[DiskName='{0}']/{1}", siblingNodeInnerText, searchNodeName))
End Function
End Module
结果:
testpath1
testpath2
testpath3
Node not found
答案 2 :(得分:0)
这是使用LINQ to XML和XML文字的另一个选项:
Dim document = XDocument.Load("MyXML.xml")
Dim path As String = (
From disk In document...<Disk>
Where disk.<DiskName>.Value = "Test"
Select disk.<DiskPath>.Value
).SingleOrDefault()
path
将是匹配的<DiskPath>
元素的值,如果找不到,则为Nothing
。