在具有属性的XML元素中查找节点?

时间:2017-06-30 21:33:55

标签: xml vb.net parsing attributes element

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

因此,当我尝试使用THIS 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>

所以在我给出的第一个例子中,这个程序运行得很好;

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格式时,哪里有属性,什么都不起作用。我的程序完全是空白的。

有人可以建议我需要做些什么来解决这个问题吗?

谢谢

3 个答案:

答案 0 :(得分:2)

尝试使用GetElementsByTagName

变化:

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

为:

nodelist = document.GetElementsByTagName("entry")

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

使用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();

        }
    }
}