从XML文件

时间:2015-07-06 09:04:56

标签: vb.net vb.net-2010

我的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

感谢您的帮助。欣赏它。

3 个答案:

答案 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