首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在MsXml-DOMDocument过程的IXMLDOMNode上“未设置对象变量”

在MsXml-DOMDocument过程的IXMLDOMNode上“未设置对象变量”
EN

Stack Overflow用户
提问于 2011-03-25 20:10:35
回答 3查看 2.4K关注 0票数 0

因此,我有一个非常大的XML文件(40MB),我必须重复搜索它。我已经了解了在XPath中使用DOMDocument的好处,我认为我是正确的,但我得到的是Obj Var不是无稽之谈。

这是初始加载...我认为它加载是因为它为一个40mb的文件延迟了一段适当的时间,并且没有返回错误。

代码语言:javascript
复制
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类型(你知道的,填充我们新手的类型列表)。在我设置了一个IXMLDOMNode之后,当我尝试赋值时,我得到了方法列表(比如".text"),但是我发现了这个错误……可能是一个错误的xpath字符串(尽管我几乎是逐字从xpath教程中偷来的)。

代码语言:javascript
复制
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文件的顶部:

代码语言:javascript
复制
<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>

感谢you.....you聪明人摇滚。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-03-25 21:40:59

你有一个区分大小写的问题--你正在寻找FixID,实际上你已经得到了FixId。当你尝试访问它的文本时,你会抛出一个异常,因为你没有实际的对象。

编辑:正如Jean-François Corbett所指出的,你的XPath也是错误的。下面是解决这两个问题的更新后的Xpath:

代码语言:javascript
复制
"/Fix_Records/FixRecord[FixId='Id you want']/Latitude"

您可能还想测试是否有要访问的节点,请参阅下面的答案以获取一些提示。

票数 1
EN

Stack Overflow用户

发布于 2011-03-26 03:35:58

您的XPath错误。"/Fix_Records/FixRecord/FixID[1]/Latitude"表示要查找Latitude元素的第一个FixID子元素的FixRecord子元素。

但是:

  • 有很多FixRecord元素,
  • 对于任何给定的FixRecord,只有一个FixId子元素(不需要指定[1]),并且

<代码>H113最重要的是,<代码>D14没有<代码>D15子元素!所以你正在寻找一些不存在的东西,这就是导致错误的原因。正如@James Walford指出的那样,

  • 也要注意区分大小写。FixID

不是FixId

我认为你想要的是:"/Fix_Records/FixRecord[1]/Latitude"

当你觉得准备好进入下一阶段时,试试这个:

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

如果这不起作用,可能会有一些名称空间的奇怪之处...尝试在Xpath中的每个节点规范之前添加xsi:

代码语言:javascript
复制
"/xsi:Fix_Records/xsi:FixRecord[1]/xsi:Latitude"
"/xsi:Fix_Records/xsi:FixRecord[xsi:FixId='mystring']/xsi:Latitude"

振作起来,你最终会到达那里的!!

票数 2
EN

Stack Overflow用户

发布于 2011-03-25 22:03:38

一旦加载了XML,仍然有可能出现解析错误。此代码可能会帮助您找到问题所在。根据您的环境对其进行相应的更改。

错误号(6666)显然是个笑话,你必须为你的应用程序提供正确的错误号。

XML:另外,尝试在http://www.validome.org/xml/validate/之类的验证器中解析您的(或者至少解析其中的一部分)。

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5432249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档