【问题标题】:Finding nodes within an XML element that has attributes?在具有属性的 XML 元素中查找节点?
【发布时间】:2017-06-30 21:33:54
【问题描述】:

目前我正在尝试解析 xml。当我用作容器时,所有信息都正确返回。当我使用程序时不返回任何信息

所以当我尝试使用这种 XML 格式列出节点时,一切正常;

<feed>
<entry>
<childnode1>blue</childnode1>
<childnode2>red</childnode2>
<childnode3>green</childnode3>
<childnode4>yellow</childnode4>
</entry>
</feed>

但我需要它以这种格式工作; (这目前不起作用)

<feed xmlns='x' xmlns:openSearch='y' xmlns:gsx='z'>
<entry>
<childnode1>blue</childnode1>
<childnode2>red</childnode2>
<childnode3>green</childnode3>
<childnode4>yellow</childnode4>
</entry>
</feed>

所以在我给出的第一个 XML 示例中,这个程序运行良好;

Imports System.IO
Imports System.Xml

Module ParsingUsingXmlDocument

Sub Main()

    Dim document As XmlDocument
    Dim nodelist As XmlNodeList
    Dim node As XmlNode

    document = New XmlDocument()
    document.Load("C:\Users\Joe\Documents\family.xml")
    nodelist = document.SelectNodes("/feed/entry")

    For Each node In nodelist
        Dim stockinfo = node.ChildNodes.Item(4).InnerText
        Console.WriteLine("Info: " & stockinfo)
        Console.Write(vbCrLf)
    Next

    Console.ReadLine()
End Sub


End Module

但是当我使用我展示的第二种 xml 格式时,其中有属性,没有任何作用。我的程序完全是空白的。

谁能建议我需要做些什么来解决这个问题?

谢谢

【问题讨论】:

标签: xml vb.net parsing attributes element


【解决方案1】:

尝试使用GetElementsByTagName

变化:

nodelist = document.SelectNodes("/feed/entry")

到:

nodelist = document.GetElementsByTagName("entry")

【讨论】:

    【解决方案2】:

    xmlns='x' xmlns:openSearch='y' xmlns:gsx='z' - 这些不是属性,而是命名空间声明。

    您的 xml 文档具有命名空间,因此您必须将它们考虑在内。

    Dim document As XmlDocument = New XmlDocument()
    document.Load("C:\Users\Joe\Documents\family.xml")
    
    Dim uri As String = "x"
    Dim manager As XmlNamespaceManager = New XmlNamespaceManager(document.NameTable)
    manager.AddNamespace("ns", uri)
    
    Dim nodelist As XmlNodeList = document.SelectNodes("/ns:feed/ns:entry", manager)
    
    For Each node As XmlNode In nodelist
        Dim stockinfo = node.ChildNodes.Item(3).InnerText
        Console.WriteLine("Info: " & stockinfo)
        Console.Write(vbCrLf)
    Next
    

    您可以从节点中获取它,而不是显式指定命名空间:

    Dim uri As String = document.DocumentElement.NamespaceURI
    

    【讨论】:

      【解决方案3】:

      轻松使用 xml linq。命名空间给你带来了问题

      using System;
      using System.Collections.Generic;
      using System.Linq;
      using System.Text;
      using System.Xml;
      using System.Xml.Linq;
      
      namespace ConsoleApplication1
      {
          class Program
          {
              const string FILENAME = @"c:\temp\test.xml";
              static void Main(string[] args)
              {
                  XDocument doc = XDocument.Load(FILENAME);
      
                  XElement entry = doc.Descendants().Where(x => x.Name.LocalName == "entry").FirstOrDefault();
      
                  string[] resutls = entry.Elements().Select(x => (string)x).ToArray();
      
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-10-05
        • 2013-02-04
        • 1970-01-01
        • 1970-01-01
        • 2011-07-06
        • 2014-01-15
        • 1970-01-01
        • 2021-06-14
        • 1970-01-01
        相关资源
        最近更新 更多