我想导航并获取我的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
答案 0 :(得分:1)
创建一个模式文件,并将其命名为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,6.0 的引用才能使用此代码。
答案 1 :(得分:0)
谢谢你的帮助。 我照你说的做了。 现在我想了解什么是本地名称以及我如何使用xpaths访问(如果可能的话)。 非常感谢您分享您的知识。 :) :) :))
使用以下代码创建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