3

I want to navigate and get details of my xml document. But it has a namespace. Due to this namespace in Multiblock element, I am getting lists.length as zero.(Please refer vba code below)

Please guide. Thanks in advance for reading. :) My xml document is:

<?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>

When I am trying to get Node details without xmlns="x-schema:ConfigFileSchema.xml" I am able to navigate through nodes and get the values.

But with the same document and xmlns attribute, i am having problem in navigating.

Here is my VBA code:

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
3
  • There are separate methods in MSXML to perform actions with namespaces (maybe ending with NS? It's been a long time since I last used MSXML.). Finding a copy of the MSXML documentation is left as an exercise... Commented Aug 20, 2017 at 7:36
  • stackoverflow.com/questions/45404020/… Commented Aug 20, 2017 at 7:47
  • Hi @TimWilliams, Thanks for answering, I used the link and tried to write for my xml document. but i am not getting values intended. Here is my code: XDoc.setProperty "SelectionLanguage", "XPath" 'Set the default namespace and give it a prefix (e.g.) "xx" XDoc.setProperty "SelectionNamespaces", _ "xmlns:xx='x-schema:ConfigFileSchema.xml'" 'Reading the List Node Set lists = XDoc.SelectNodes("//xx:MultiBlock/xx:Block") Commented Aug 20, 2017 at 8:14

2 Answers 2

2

Create a schema file and name it ConfigFileSchema.xml in the same folder as J60AOV1136.cnf.xml

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

Use the following modified sample:

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

Note that you need to add a reference to Microsoft XML, 6.0 to use this code.

Sign up to request clarification or add additional context in comments.

Comments

0

thankyou for helping. I did as you said. Now i am trying to understand what is local-name and how i can access using xpaths (if it is possible). Thankyou very much for sharing your knowledge. :) :) :)

Created a xml schema file using code below:

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.