-1

这是 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 标记中间的节点及其子节点的所有属性。

4

2 回答 2

0

我不确定你到底在问什么,如果不知道你要处理的 XML 的格式,我不能给你一个具体的例子,但我认为你正在寻找的是 XmlNode 的 Attributes 属性对象。每个 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 属性。

于 2012-05-25T12:50:33.620 回答
0

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

于 2012-05-25T20:41:28.520 回答