当使用VBA存在名称空间时获取XML节点值

我想浏览并获取我的XML文档的详细信息。 但它有一个命名空间。 由于Multiblock元素中的这个命名空间,我将lists.length为零(请参考下面的vba代码)

请指导。 提前致谢阅读。 :)我的xml文件是:

 <?xml version="1.0" encoding="UTF-16"?> <MultiBlock xmlns="x-schema:ConfigFileSchema.xml"> <ErdbVersion> <DbVersion>14.0</DbVersion> <DbDesc>ERDB Release EXP431.1-49.0</DbDesc> <DbGUID>56CFAF87-53A9-4042-8B4F-4CF94868416E</DbGUID> <DbLangID>ENU</DbLangID> </ErdbVersion> <Block> <BlockDef> <BlockName>J60AOV1136</BlockName> <EntityName>J60AOV1136</EntityName> <BlockId>20031267</BlockId> <BlockGUID>D11BF0DB-803D-49FC-A594-D234ABD1E156 </BlockGUID> <BlockDesc>Exported on (MM-DD-YY HH:MM) 07-31- 2017 10:12</BlockDesc> <TemplateName>SYSTEM:CONTROLMODULE</TemplateName> <ClassName>CONTROLMODULE</ClassName> <BaseTemplateName>SYSTEM:CONTROLMODULE </BaseTemplateName> <CreateType> </CreateType> <Attribute>1610613248</Attribute> <LifeCycleState>Loaded</LifeCycleState> <AssignedTo>STFCEE8A_03</AssignedTo> <Container></Container> </BlockDef> <Parameters> <Parameter> <ParamName>ALIASOPT</ParamName> <ParamValue>OFF</ParamValue> </Parameter> <Parameter> <ParamName>DISCOVORDER</ParamName> <ParamValue>"TPN"</ParamValue> </Parameter> <Parameter> <ParamName>METHODSCOPE</ParamName> <ParamValue>"ALL"</ParamValue> </Parameter> </Parameters </Block </MultiBlock> 

当我试图获取没有xmlns="x-schema:ConfigFileSchema.xml"节点详细信息时,我可以浏览节点并获取值。

但是具有相同的文档和xmlns属性,我在导航中遇到问题。

这是我的VBA代码:

 Sub AOVXML() Dim XDoc As MSXML2.DOMDocument Dim firstNamefield As MSXML2.IXMLDOMNodeList Dim lists As MSXML2.IXMLDOMNodeList Dim i, j As Integer 'Dim lists As MSXML2.IXMLDOMNode Set XDoc = CreateObject("MSXML2.DOMDocument") XDoc.async = False: XDoc.validateOnParse = False XDoc.Load (ThisWorkbook.Path & "\J60AOV1136.cnf.xml") 'Reading the List Node Set lists = XDoc.SelectNodes("//MultiBlock/Block") MsgBox "Length of Lists nodes : " & lists.Length & vbCrLf & _ "First XML List Node : " 'Getting First Child node under Lists Set firstNamefield = lists(0).ChildNodes MsgBox firstNamefield.Length 'Looping through all XML nodes under List node For i = 0 To firstNamefield.Length - 1 MsgBox firstNamefield(i).XML Next i Set XDoc = Nothing End Sub 

创build一个模式文件,并将其命名为ConfigFileSchema.xml,位于与J60AOV1136.cnf.xml相同的文件夹中

 <?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

使用以下修改的示例:

 Option Explicit Sub AOVXML() Dim XDoc As MSXML2.DOMDocument60 Dim firstNamefield As MSXML2.IXMLDOMNodeList Dim lists As MSXML2.IXMLDOMNodeList Dim i As Integer Dim thePath As String Set XDoc = CreateObject("MSXML2.DOMDocument.6.0") 'Must be 6 for schema parsing to pass XDoc.async = False thePath = ThisWorkbook.Path & "\J60AOV1136.cnf.xml" '* '* It is useful to have the reason for a possible error '* Sample code found here: '* https://msdn.microsoft.com/en-us/library/aa468547.aspx '* If Not XDoc.Load(thePath) Then ' The document failed to load. Dim strErrText As String Dim xPE As MSXML2.IXMLDOMParseError Set xPE = XDoc.parseError With xPE strErrText = "Your XML Document failed to load due the following error." & vbCrLf & _ "Error #: " & .ErrorCode & ": " & xPE.reason & _ "Line #: " & .Line & vbCrLf & _ "Line Position: " & .linepos & vbCrLf & _ "Position In File: " & .filepos & vbCrLf & _ "Source Text: " & .srcText & vbCrLf & _ "Document URL: " & .Url End With MsgBox strErrText Exit Sub End If '* '* Reading the List Node '* To accept all namespaces, use the form //*[local-name()='<nodename>'] '* Set lists = XDoc.SelectNodes("//*[local-name()='Block']") '<- here is the major change If lists.Length > 0 Then MsgBox "Length of Lists nodes : " & lists.Length & vbCrLf & "First XML List Node : " '* '* Getting First Child node under Lists '* Set firstNamefield = lists(0).ChildNodes MsgBox firstNamefield.Length '* '* Looping through all XML nodes under List node '* For i = 0 To firstNamefield.Length - 1 MsgBox firstNamefield(i).XML Next i End If Set XDoc = Nothing End Sub 

请注意,您需要添加对Microsoft XML的引用才能使用此代码。

感谢您的帮助。 我照你所说的做了 现在我想了解什么是本地名称,以及如何使用xpaths访问(如果可能的话)。 谢谢分享你的知识。 🙂 🙂 🙂

使用下面的代码创build一个XML模式文件:

 Sub Create_Schema() Dim StrMyXml As String, MyMap As XmlMap Dim StrMySchema As String ' Book.xml is the file created in section one of this topic. StrMyXml = ThisWorkbook.Path & "\J60AOV1136.cnf.xml" ' Turn off async loading. Application.DisplayAlerts = False ' Add the string to the XmlMaps collection. Set MyMap = ThisWorkbook.XmlMaps.Add(StrMyXml) Application.DisplayAlerts = True ' Create an empty file and output the schema. StrMySchema = ThisWorkbook.XmlMaps(1).Schemas(1).XML Open ThisWorkbook.Path & "\ConfigFileSchema.xml" For Output As #1 Print #1, StrMySchema Close #1 End Sub