Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MSXML2.DOMDocument60-使用命名空间在VBA中读取XML_Xml_Vba_Ms Access_Xml Parsing_Domdocument - Fatal编程技术网

MSXML2.DOMDocument60-使用命名空间在VBA中读取XML

MSXML2.DOMDocument60-使用命名空间在VBA中读取XML,xml,vba,ms-access,xml-parsing,domdocument,Xml,Vba,Ms Access,Xml Parsing,Domdocument,我是Access和MSXML2.DOMDocument60编程新手,如果有任何不正确之处,请接受我的道歉。我试图解析xml,但在使用MSXML2.DOMDocument加载它时遇到了问题。XML的结构如下所示: <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE raml SYSTEM 'raml20.dtd'> <raml version="2.0" xmln

我是Access和MSXML2.DOMDocument60编程新手,如果有任何不正确之处,请接受我的道歉。我试图解析xml,但在使用MSXML2.DOMDocument加载它时遇到了问题。XML的结构如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE raml SYSTEM 'raml20.dtd'>
<raml version="2.0" xmlns="raml20.xsd">
  <cmData type="actual">
    <header>
      <log dateTime="2021-03-11T13:00:47.000Z" action="created" appInfo="ActualExporter">InternalValues are used</log>
    </header>
    <managedObject class="RETU_R" version="EQMR20A_2003_002" distName="PLMN-PLMN/MRBTS-503327/EQM_R-1/APEQM_R-1/ALD_R-1/RETU_R-1" id="136127888">
      <p name="angle">20</p>
      <list name="antBandList">
        <item>
          <p name="antBeamwidth">61</p>
          <p name="antFreqBand">1</p>
          <p name="antOperGain">185</p>
        </item>
        <item>
          <p name="antBeamwidth">60</p>
          <p name="antFreqBand">2</p>
          <p name="antOperGain">185</p>
        </item>
        <item>
          <p name="antBeamwidth">61</p>
          <p name="antFreqBand">3</p>
          <p name="antOperGain">184</p>
        </item>
      </list>
      <p name="antBearing">2800</p>
      <p name="antModel">80010825-2.1_L</p>
      <p name="antSerial">DEG3535443</p>
      <list name="antlDNList">
        <p>external</p>
      </list>
      <p name="baseStationID">45118</p>
      <p name="configDN">MRBTS-503327/EQM-1/APEQM-1/ALD-9/RETU-1</p>
      <p name="installDate">240814</p>
      <p name="installerID">CRCTL</p>
      <p name="maxAngle">60</p>
      <p name="mechanicalAngle">0</p>
      <p name="minAngle">0</p>
      <p name="operationalState">1</p>
      <p name="sectorID">3U21</p>
      <p name="subunitNumber">1</p>
    </managedObject>
    
  </cmData>
</raml>

使用内部值

20

61

1

185

60

2

185

61

3

184

2800

80010825-2.1

DEG3535443

外部的

45118

MRBTS-503327/EQM-1/APEQM-1/ALD-9/RETU-1

240814

CRCTL

60

0

0

1

3U21

1

我知道我的代码具有名称空间,这可能导致所有问题。我在vba中创建了错误解码消息,出现以下错误:

“无法加载文档:C:\Audit\u DB\Input Files\Test1.xml
加载was时出错:已使用元素“raml”,但未在DTD/Schema中声明。“

有人能告诉我如何跳过这里的名称空间,以及vba代码是否有任何错误。我创建的代码如下:

Sub XMLRead()

Dim path As String
Dim firstNameField As MSXML2.IXMLDOMNodeList
Dim lists As MSXML2.IXMLDOMNodeList
Dim raml As MSXML2.IXMLDOMElement

Dim i As Integer
Dim objXML As MSXML2.DOMDocument60
Set objXML = New MSXML2.DOMDocument60
path = "C:\Audit_DB\Input Files\Test1.xml"

objXML.SetProperty "ProhibitDTD", False

With objXML
    .async = False
    .Load path
    .SetProperty "SelectionLanguage", "XPath"
    .SetProperty "ProhibitDTD", False
    .SetProperty "SelectionNamespaces", "xmlns:raml='raml20.xsd'"
    Set nodeList = .selectNodes("//managedObject")
End With


If objXML.Load(path) Then
    Debug.Print "Success"
Else
    Debug.Print "Could not load the document: " & path
    If objXML.parseError.errorCode <> 0 Then Debug.Print "Error when loading was: " + objXML.parseError.reason
End If
    
Set xobjdetails = objXML.childNodes(0)
Set xObject = objXML.firstChild
    

Debug.Print objXML.selectNodes("//managedObject").length

End Sub
Sub-XMLRead()
将路径设置为字符串
将FirstName字段设置为MSXML2.IXMLDOMNodeList
Dim列表为MSXML2.IXMLDOMNodeList
作为MSXML2.IXMLDOMELENT的Dim raml
作为整数的Dim i
Dim objXML作为MSXML2.DOMDocument60
设置objXML=New MSXML2.DOMDocument60
path=“C:\Audit\u DB\Input Files\Test1.xml”
objXML.SetProperty“ProhibitDTD”,False
使用objXML
.async=False
.加载路径
.SetProperty“SelectionLanguage”、“XPath”
.SetProperty“prohibidtd”,False
.SetProperty“SelectionNamespaces”,“xmlns:raml='raml20.xsd'”
Set nodeList=.selectNodes(//managedObject)
以
如果是objXML.Load(路径),则
调试。打印“成功”
其他的
Debug.Print“无法加载文档:”&路径
如果objXML.parseError.errorCode为0,则Debug.Print“加载时出错为:”+objXML.parseError.reason
如果结束
设置xobjdetails=objXML.childNodes(0)
设置xObject=objXML.firstChild
Debug.Print objXML.selectNodes(“//managedObject”).length
端接头

XML解析器试图遵守文档类型声明:

<!DOCTYPE raml SYSTEM 'raml20.dtd'>
必须禁用这两个设置,否则加载将无法成功。在尝试加载文件之前,请确保已设置它们


也就是说,
//managedObject
找不到任何内容,因为该节点与文档中的所有其他元素一样位于
raml20.xsd
命名空间中

您已经将该名称空间绑定到前缀
raml
(使用
.SetProperty“SelectionNamespaces”,“xmlns:raml='raml20.xsd'
),但您也需要使用前缀:

Debug.Print objXML.selectNodes("//raml:managedObject").length

最后,您的VBA代码需要进行一些清理。你设置了两次
prohibidtd
,还多次调用
.load

谢谢,伙计,这就像一个符咒——我复制了它,因为我在代码中尝试了一些东西,但我相信这不是真正的原因。感谢您对如何使用名称空间前缀选择节点的详细说明。@Muhammad您可以选择任何您喜欢的前缀,顺便说一句。如果您不想一直编写
raml
,请选择
r
。@Muhammad可能有一个XPath表达式可以帮助您一次获得正确的节点,也许是按照
//raml:managedObject[@distname='something']//raml:p[@name='something']
的思路,但我们不要将这里的注释作为XPath 101。有大量的XPath教程,浏览其中的一些不会有什么坏处。谢谢你,伙计,我已经使用for循环浏览了所有的子节点。我只是在想,是否有一种方法可以直接访问参数,但在我这一级,它有点让人困惑。代码稍微变大了一点,但它可以完美地读取所有节点/子节点。现在我需要找出在循环时更新访问表的最佳方法。非常感谢你的邀请help@UnhandledException不。命名空间前缀只是命名空间URI的快捷方式。XML可以选择它想要的任何前缀,处理XML的代码可以选择它想要的任何前缀。唯一相关的是两者最终都引用了相同的名称空间URI。(仔细想想,如果仅仅因为输入文件突然被格式化为
,就必须重写处理代码,那将是毫无意义的。)谢谢兄弟,它加载得非常好。干杯
With objXML
    ' ...
    .resolveExternals = False
    .validateOnParse = False
    ' ...
    .load "filepath"
End With
Debug.Print objXML.selectNodes("//raml:managedObject").length