找不到对象解析XML

时间:2013-09-04 17:36:36

标签: xml vb.net xpath xmldocument

我将以下XML返回给我:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
  <document xmlns="@link" xmlns:xsi="@link" xsi:schemaLocation="@link" version="1.0">
    <field left="0" top="0" right="100" bottom="20" type="text">
      <value encoding="utf-16">11266</value>
      <line left="8" top="4" right="55" bottom="17">
        <char left="8" top="4" right="13" bottom="16" confidence="65" suspicious="true">1</char>
        <char left="18" top="4" right="23" bottom="16" confidence="68" suspicious="true">1</char>
        <char left="27" top="4" right="35" bottom="16" confidence="100">2</char><char left="36" top="4" right="45" bottom="17" confidence="100">6</char>
        <char left="46" top="4" right="55" bottom="16" confidence="100">6</char>
      </line>
   </field>
</document>

我试图阅读value节点。我的代码如下所示:

Dim m_xmld = New XmlDocument()
m_xmld.Load(xmlfile) 
Return m_xmld.SelectSingleNode("/field/value").InnerText

我做错了什么?我试过/document/field/value也无济于事(

2 个答案:

答案 0 :(得分:0)

尝试从根目录中选择节点,如下所示:

Dim m_xmld = New XmlDocument()
m_xmld.Load(xmlfile) 

Return FindNode(m_xmld, "value")

尝试使用此功能搜索节点:

Private Function FindNode(list As XmlNodeList, nodeName As String) As XmlNode
    If list.Count > 0 Then
        For Each node As XmlNode In list
            If node.Name.Equals(nodeName) Then
                Return node
            End If
            If node.HasChildNodes Then
                FindNode(node.ChildNodes, nodeName)
            End If
        Next
    End If

    Return Nothing
End Function

答案 1 :(得分:0)

您的代码存在两个问题。首先,您需要指定XML命名空间。 XML文档在文档元素(xmlns="@link")上包含默认命名空间。这意味着在引用文档中的任何元素时必须显式指定该命名空间。要使用XmlDocument执行此操作,您需要创建XmlNamespaceManager并将其传递给select方法。例如:

Dim m_xmld As New XmlDocument()
m_xmld.Load(xmlfile)
Dim nsmgr As New XmlNamespaceManager(m_xmld.NameTable)
nsmgr.AddNamespace("x", "@link")
return m_xmld.SelectSingleNode("/x:document/x:field/x:value", nsmgr).InnerText

或者,如果您不想对命名空间URI进行硬编码,您可以从加载的文档中抓取它,如下所示:

nsmgr.AddNamespace("x", m_xmld.DocumentElement.NamespaceURI)

第二个问题是您尝试选择/field/value而不是/document/field/value。当您从XmlDocument对象本身进行选择时,选择从文档的根开始(文档元素“上方”)。