因此,我有一个非常大的XML文件(40MB),我必须重复搜索它。我已经了解了在XPath中使用DOMDocument的好处,我认为我是正确的,但我得到的是Obj Var不是无稽之谈。
这是初始加载...我认为它加载是因为它为一个40mb的文件延迟了一段适当的时间,并且没有返回错误。
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教程中偷来的)。
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>感谢you.....you聪明人摇滚。
发布于 2011-03-25 21:40:59
你有一个区分大小写的问题--你正在寻找FixID,实际上你已经得到了FixId。当你尝试访问它的文本时,你会抛出一个异常,因为你没有实际的对象。
编辑:正如Jean-François Corbett所指出的,你的XPath也是错误的。下面是解决这两个问题的更新后的Xpath:
"/Fix_Records/FixRecord[FixId='Id you want']/Latitude"您可能还想测试是否有要访问的节点,请参阅下面的答案以获取一些提示。
发布于 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::
"/xsi:Fix_Records/xsi:FixRecord[1]/xsi:Latitude"
"/xsi:Fix_Records/xsi:FixRecord[xsi:FixId='mystring']/xsi:Latitude"振作起来,你最终会到达那里的!!
发布于 2011-03-25 22:03:38
一旦加载了XML,仍然有可能出现解析错误。此代码可能会帮助您找到问题所在。根据您的环境对其进行相应的更改。
错误号(6666)显然是个笑话,你必须为你的应用程序提供正确的错误号。
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 Subhttps://stackoverflow.com/questions/5432249
复制相似问题