2013-09-04 7 views
1

У меня есть следующие X возвращаемого мне:Объект не найден Разбор 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, а без толку :(

ответ

0

Там это две проблемы с вашим кодом: во-первых, вам нужно указать пространство имен XML. XML-документ содержит пространство имен по умолчанию для элемента документа (xmlns="@link"). Это означает, что вы должны явно указывать это пространство имен при ссылке на любой элемент документа.Чтобы сделать это с помощью XmlDocument, вам необходимо создать XmlNamespaceManager и передать его методам выбора. Например:

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, сам выбор начинается с корня документа («над» элементом документа).

+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 
+0

Не повезло, все еще получая ошибку null –

+0

Обновленный ответ для более грубой силы. –