VBA中为XML根标签添加xmlns属性时子标签出现空命名空间的问题
VBA生成XML时子节点出现空命名空间的原因及解决方法
问题背景
用VBA生成XML时,给根节点添加默认命名空间后,子节点被自动加上了xmlns=""属性,导致XML结构不符合预期。
初始代码及正常输出
初始生成XML的代码:
Dim oDoc As New MSXML2.DOMDocument60 Dim xMetrics As IXMLDOMNode Dim XDoc As Object, root As Object, elem As Object Dim rel As Object ' oDoc.Load "C:\Users\Claudio\Downloads\IT04384550879_00598.xml" Set XDoc = CreateObject("MSXML2.DOMDocument") Set root = XDoc.createElement("StandardBusinessDocument") XDoc.appendChild root ' 添加子节点到根节点 Set elem = XDoc.createElement("StandardBusinessDocumentHeader") root.appendChild elem
生成的正常XML结构:
<StandardBusinessDocument> <StandardBusinessDocumentHeader/> </StandardBusinessDocument>
添加命名空间后的异常情况
给根节点添加默认命名空间的代码:
Set rel = XDoc.createAttribute("xmlns") rel.NodeValue = "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader" root.setAttributeNode rel
生成的XML出现异常,子节点多了空命名空间:
<StandardBusinessDocument xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"> <StandardBusinessDocumentHeader xmlns=""/> </StandardBusinessDocument>
原因
这是XML命名空间的核心规则导致的:
- 根节点设置的不带前缀的
xmlns是默认命名空间,会自动作用于所有未指定命名空间的子节点,除非子节点明确声明其他命名空间。 - 但你创建子节点时用的是无命名空间参数的
createElement,这相当于把该节点归到了空命名空间。 - XML解析器为了明确区分,就会给这个子节点加上
xmlns="",强制说明它不属于根节点的默认命名空间。
解决办法
创建子节点时,要将其放到根节点的同一个命名空间下,有两种方式:
方式一:创建子节点时指定命名空间
修改子节点的创建代码,使用带命名空间URI参数的createElement方法:
' 第二个参数传入根节点的命名空间URI Set elem = XDoc.createElement("StandardBusinessDocumentHeader", "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader") root.appendChild elem
方式二:创建根节点时直接指定命名空间,子节点自动继承
创建根节点时就指定命名空间,后续子节点默认继承该命名空间:
' 创建根节点时传入命名空间URI Set root = XDoc.createElement("StandardBusinessDocument", "http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader") XDoc.appendChild root ' 子节点无需额外指定命名空间,自动继承 Set elem = XDoc.createElement("StandardBusinessDocumentHeader") root.appendChild elem
两种方式生成的正确XML结构:
<StandardBusinessDocument xmlns="http://www.unece.org/cefact/namespaces/StandardBusinessDocumentHeader"> <StandardBusinessDocumentHeader/> </StandardBusinessDocument>
内容的提问来源于stack exchange,提问作者Claudio
相关产品推荐
相关产品推荐

