使用xmlDocument,xmlNode和xmlNodelist从xml检索数据

时间:2012-05-25 09:34:55

标签: vb.net

这是vb.net中的示例代码,其中我检索没有属性的元素的详细信息。

For Each standardItemInfoNode In ItemInfoNodes
        baseDataNodes = ItemInfoNodes.ChildNodes
        bFirstInRow = True
        For Each baseDataNode As XmlNode In baseDataNodes
            If (bFirstInRow) Then
                bFirstInRow = False
            Else
                Response.Write("<br>")
            End If
            Response.Write(baseDataNode.Name & ": " & baseDataNode.InnerText)
        Next
    Next

如何检索xml的详细信息,例如具有属性的节点及其子节点也具有属性。我需要检索节点及其子节点的所有属性,这些属性存在于其他xml标记的中间。

2 个答案:

答案 0 :(得分:0)

我不确定你究竟在问什么,如果不知道你想要处理的XML的格式,我就不能给你一个具体的例子,但我认为你要找的是Attributes属性XmlNode对象。每个XmlNode都有一个Attributes属性,允许您访问该节点的所有属性。这是解释它的MSDN页面(并提供了一个简单的例子):

http://msdn.microsoft.com/en-us/library/7f285y48.aspx

编辑:

使用您在评论中发布的示例XML,您可以阅读所有值和属性,如下所示:

    Dim doc As XmlDocument = New XmlDocument()
    doc.LoadXml("<EventTracker><StandardItem><Header1>Header1 Text</Header1> <Header2>Header2 Text</Header2></StandardItem><Item> <Events> <EventSub EventId='73' EventName='Orchestra' Description='0'> <Person PersonId='189323156' PersonName='Chandra' Address='Arunachal'/><Person PersonId='189323172' PersonName='Sekhar' Address='Himachal'/></EventSub> </Events> </Item> </EventTracker>")
    Dim header1 As String = doc.SelectSingleNode("EventTracker/StandardItem/Header1").InnerText
    Dim header2 As String = doc.SelectSingleNode("EventTracker/StandardItem/Header2").InnerText
    For Each eventSubNode As XmlNode In doc.SelectNodes("EventTracker/Item/Events/EventSub")
        Dim eventId As String = eventSubNode.Attributes("EventId").InnerText
        Dim eventName As String = eventSubNode.Attributes("EventName").InnerText
        Dim eventDescription As String = eventSubNode.Attributes("Description").InnerText
        For Each personNode As XmlNode In eventSubNode.SelectNodes("Person")
            Dim personId As String = personNode.Attributes("PersonId").InnerText
            Dim personName As String = personNode.Attributes("PersonName").InnerText
            Dim personAddress As String = personNode.Attributes("Address").InnerText
        Next
    Next

但是,如果您像这样加载XML中的所有数据,我建议将XML反序列化为EventTracker对象。或者,正如我在您对帖子的评论中所说,如果阅读XML文档的唯一目的是将其转换为另一个XML或HTML文档,我建议使用XSLT。

如果要测试属性是否存在,可以执行以下操作:

Dim attribute As XmlNode = personNode.Attributes.GetNamedItem("PersonId")
If attribute IsNot Nothing Then
    Dim personId As String = attribute.InnerText
End If

但是,序列化会更容易,因为反序列化的对象对于任何不存在的元素都只具有null属性。

答案 1 :(得分:0)

您可以使用SelectSingleNode("XPath or NodeName")并遍历该节点上的Attributes.Item(index)。如果您事先知道子节点名称,也可以循环浏览SelectSingleNode("XPath Or NodeName").SelectSingleNode("XPath or ChildName").Attributes.Item(index)