我有一个XML文件,该XML文件声明了名称空间
<CrystalReport xmlns="urn:crystal-reports:schemas:report-detail" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:crystal-reports:schemas:report-detail http://www.businessobjects.com/products/xml/CR2008Schema.xsd">
这导致我在Excel中的VBA代码出现问题。当我删除上面这行的命名空间时,它工作正常。
我的问题是:如何忽略此命名空间,而不必打开xml文件并手动删除?
我使用的代码:
Public xmlDOM As MSXML2.DOMDocument60
Public Sub setXML(xmlFileName As String)
'Set xmlDOM = CreateObject("MSXML2.DOMDocument")
Set xmlDOM = New MSXML2.DOMDocument60
xmlDOM.async = False
xmlDOM.Load xmlFileName
End Sub
Public Function getNode(p_strNode As Variant) As Variant
Dim objNodes As IXMLDOMNodeList
Dim objNode As IXMLDOMNode
Dim storage As Variant
Dim X As Integer
Set objNodes = xmlDOM.SelectNodes(p_strNode)
Set getNode = objNodes
End Function
Public Sub SB_StartLoadClarityReport()
Dim d_path As String
Dim d_node As Variant
Dim d_arrayFields As Variant
d_path = F_GetPathXML()
'@Temp
d_path = Cells(1, 1).Value
'Open XML File
setXML (d_path)
'Get the project fields
Set d_node = getNode("CrystalReport/Details/Section")
d_arrayFields = F_GetProjectFields(d_node)
End Sub
Private Function F_GetProjectFields(p_strNode As Variant)
'Get the project fields
'Ex: <Field Name="PROJECTNAME1" - Get PROJECTNAME1
Dim d_arrayFields As Variant
Dim p_item As IXMLDOMElement
Dim d_count As Integer
d_count = 1
For Each p_item In p_strNode.Item(0).ChildNodes
If d_count = 1 Then
ReDim d_arrayFields(1 To d_count)
Else
ReDim Preserve d_arrayFields(1 To d_count)
End If
d_arrayFields(d_count) = p_item.Attributes.Item(0).Text
d_count = d_count + 1
Next p_item
F_GetProjectFields = d_arrayFields
End Function
2条答案
按热度按时间brtdzjyr1#
这对我很有效(经过一番挠头)
hc8w905p2#
我花了几个小时试图找到一个适当的解决方案,忽略任何名称空间,而不必在
.setProperty "SelectionNamespaces"
中设置它们,因为我不想更改我的.SelectNodes("//Test")
代码以匹配每个可能的名称空间!对我有效的解决方案需要使用
.transformNodeToObject
方法:提供的
xsl:stylesheet
删除了所有的命名空间,同时保留了属性和注解,但是你可以修改它来删除它们。现在我使用我的初始代码.SelectNodes("//Test")
,而不用担心我加载的任何命名空间!EDIT经过一番研究,我设法修改xsl:stylesheet以保持缩进,因为原始代码只是一个接一个地堆叠元素,所以在元素标记前后添加2个换行符(如
<xsl:text>
</xsl:text>
)解决了这个问题。说明
Microsoft XML, v6.0
。.xsl
中,并使用 *.load "file.xsl"
* 方法代替,但我更喜欢这种方式,因为它尽可能独立!<tags></tags>
的结尾问题,则需要使用以下 PrettyPrintXML 函数来获取<tags/>
: