«Переменная объекта не установлена» в IXMLDOMNode процедуры MsXml-DOMDocument - PullRequest
0 голосов
/ 25 марта 2011

Итак, у меня есть этот довольно большой XML-файл (40 МБ), который мне придется многократно искать. Я изучал преимущества использования DOMDocument с XPath и думал, что все правильно, но я получаю ерунду Obj Var Not Set.

Вот начальная загрузка ... Я думаю, что это загрузка, потому что она задерживает соответствующий промежуток времени для файла 40 МБ и не возвращает ошибку.

Dim someElement As IXMLDOMNode
Dim xmlDoc As Object
Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0")

'<-thats a valid file name lookup
xmlDoc.Load DLookup("gsgtver", "Eramdat", "EramID = 1") 

Так вот, где это становится рискованным. Мне нужен IXMLDOMNode для чтения проанализированного объекта xmlDoc. Я проверил справочную библиотеку MsXml 6.0, и я получаю тип var при уменьшении яркости (вы знаете, список типов, которые заполняют нас, noobs). И после того, как у меня есть набор IXMLDOMNode, я получаю список методов (например, ".text"), когда пытаюсь назначить, но я ошибаюсь из-за этой ошибки ..... может быть строкой bum xpath (хотя я в значительной степени дословно украл его из учебника xpath).

sNodeName = "/Fix_Records/FixRecord/FixID[1]/Latitude"
Set someElement = xmlDoc.SelectSingleNode(sNodeName)

'yes, I dimmed xBuffer as a string up above
sBuffer = someElement.text 

Кстати, я ДЕЙСТВИТЕЛЬНО хочу сделать что-то вроде "FixID = 'mystring'", но я делаю элемент 1 только для того, чтобы он заработал. И вот вершина XML-файла:

<Fix_Records xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:noNamespaceSchemaLocation="Fix.xsd"> 
 <!-- ******************************************************** -->
 <!-- Local SITE ID        : ZAB                               -->
 <!-- Local Release Version: a082a210                          -->
 <!-- NASD/NADR Version    : z084b210                          -->
 <!-- Date                 : 02-03-2011 19:02:56               -->
 <!-- ******************************************************** -->

    <FixRecord>
      <FixId>00BTR</FixId>
      <IcaoCode>K7</IcaoCode>
      <FixType>WAYPOINT</FixType>
      <FixName>BTR055100</FixName>
      <FixinUs>true</FixinUs>
      <IsNational>true</IsNational>
      <HighPowerVor>false</HighPowerVor>
      <DPositionMapData>false</DPositionMapData>
      <Latitude>31170205N</Latitude>
      <Longitude>089353453W</Longitude>
      <AngularCorr>-0.010472</AngularCorr>
      <XSpherical>0.006082693951808</XSpherical>
      <YSpherical>-0.85612436871425</YSpherical>
      <ZSpherical>0.516734038096893</ZSpherical>
    </FixRecord>
    <FixRecord>
      <FixId>00N10</FixId>
      <IcaoCode>MM</IcaoCode>

Спасибо ..... вы умные люди рок.

Ответы [ 3 ]

2 голосов
/ 25 марта 2011

Ваш XPath неверен."/Fix_Records/FixRecord/FixID[1]/Latitude" означает, что вы ищете дочерний элемент Latitude первого дочернего элемента FixID элемента THE FixRecord.

Но:

  • Есть много FixRecord элементов,
  • Для любого данного FixRecord, есть только один FixId дочерний элемент (нет необходимостиуказать [1]) и
  • Самое главное, FixId не имеет дочернего элемента Latitude!Итак, вы ищете что-то, чего нет, что и является причиной ошибки.
    • Также следите за чувствительностью к регистру, как указано @James Walford.FixId не FixID

Я думаю, что вы хотите: "/Fix_Records/FixRecord[1]/Latitude".

Когда вы чувствуете, что готовы перейти на следующий уровеньпопробуйте это:

"/Fix_Records/FixRecord[FixId='mystring']/Latitude".

Если это не сработает, возможно, есть странность в пространстве имен ... Попробуйте добавить xsi: перед каждой спецификацией узла в Xpath:

"/xsi:Fix_Records/xsi:FixRecord[1]/xsi:Latitude"
"/xsi:Fix_Records/xsi:FixRecord[xsi:FixId='mystring']/xsi:Latitude"

Продолжайте в том же духе, вы в конечном итоге доберетесь !!

1 голос
/ 25 марта 2011

У вас проблема с учетом регистра - вы ищете FixID, у вас фактически есть FixId.Когда вы пытаетесь получить доступ к его тексту, вы генерируете исключение, поскольку у вас нет фактического объекта.

РЕДАКТИРОВАТЬ: как указал Жан-Франсуа Корбетт, ваш XPath также неверен.Вот обновленный Xpath, решающий обе проблемы:

"/Fix_Records/FixRecord[FixId='Id you want']/Latitude"

Возможно, вы также захотите проверить, есть ли у вас узел для доступа, см. Ответ ниже для некоторых советов.

0 голосов
/ 25 марта 2011

После загрузки XML все еще существует вероятность ошибки синтаксического анализа. Этот код может помочь вам найти причину проблемы. Измените его в соответствии с вашей средой.

Номера ошибок (6666), очевидно, шутка, у вас должны быть правильные номера ошибок для вашего приложения.

Редактировать: Также попробуйте проанализировать ваш XML (или хотя бы его часть) в валидаторе XML, например http://www.validome.org/xml/validate/.

Public Sub readXMLDoc()

    Dim objXML As MSXML2.DOMDocument
    Dim lookupNode As MSXML2.IXMLDOMNode
    Dim vOut As Variant
    Dim sNodeName As String
    Dim sParseError As String


    On Error GoTo ProcError

    Set objXML = New MSXML2.DOMDocument

    objXML.async = False
    objXML.LoadXML "c:\XMLSample.xml"

    If objXML Is Nothing Then Err.Raise 6666, , "Error while opening the XML file"

    sParseError = objXML.parseError.reason

    If Len(sParseError) > 0 Then Err.Raise 6666, , "Error while parsing the XML file: " & sParseError

    sNodeName = "/Fix_Records/FixRecord/FixID[1]/Latitude"

    Set lookupNode = objXML.SelectSingleNode(sNodeName)

    If lookupNode.ChildNodes.Length > 0 Then

        'Do your handling

    End If

ProcExit:

    Exit Sub

ProcError:

    Debug.Assert False
    Debug.Print Err.Description
    Resume ProcExit

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...