VBA使用MSXML生成XML时子元素自动添加xmlns空命名空间问题
VBA MSXML生成XML出现多余xmlns属性问题解答
问题产生原因
该问题由XML命名空间规则和MSXML的接口默认行为共同导致:
- 你已通过
createNode方法为根节点Main显式指定了命名空间http://www.myurl.com/xml,但后续所有子元素均使用createElement方法创建,该方法默认会为元素分配空命名空间,不会自动继承父节点的命名空间。 - 当空命名空间的元素被插入到所属非空命名空间的父节点下时,MSXML为了明确区分元素所属命名空间,会自动为子元素添加
xmlns=""属性。 - 你将
Info改为用createNode指定相同命名空间后,Info与根节点同属一个命名空间,此时下一级的BaseData仍为空命名空间,因此xmlns=""会自动出现在BaseData上,属于同一问题的不同表现。
解决方法
所有属于http://www.myurl.com/xml命名空间下的元素,都需要使用createNode方法显式指定和根节点一致的命名空间,不要使用无命名空间参数的createElement。
修正后的代码示例:
Dim doc As New MSXML2.DOMDocument60 Dim root As IXMLDOMNode Dim info As IXMLDOMElement, baseData As IXMLDOMElement Dim someCode As IXMLDOMElement, someName As IXMLDOMElement, hardware As IXMLDOMElement, freq As IXMLDOMElement, creationDate As IXMLDOMElement Dim namesp As String namesp = "http://www.myurl.com/xml" Set root = doc.createNode(NODE_ELEMENT, "Main", namesp) doc.appendChild root ' 所有子元素均使用createNode指定命名空间 Set info = doc.createNode(NODE_ELEMENT, "Info", namesp) Set baseData = doc.createNode(NODE_ELEMENT, "BaseData", namesp) Set someCode = doc.createNode(NODE_ELEMENT, "SomeCode", namesp) Set someName = doc.createNode(NODE_ELEMENT, "SomeName", namesp) Set hardware = doc.createNode(NODE_ELEMENT, "Hardware", namesp) Set freq = doc.createNode(NODE_ELEMENT, "Frquency", namesp) Set creationDate = doc.createNode(NODE_ELEMENT, "CreationDate", namesp) freq.Text = "100" hardware.appendChild freq creationDate.Text = "2021-11-10" someCode.Text = "000000_0000000" someName.Text = "HW GPU SoC 1" baseData.appendChild creationDate baseData.appendChild hardware baseData.appendChild someCode baseData.appendChild someName info.appendChild baseData root.appendChild info doc.Save (filePath)
如果需要简化代码,可以封装自定义函数避免重复传命名空间参数:
' 放在模块顶部通用声明区 Private Function CreateNSNode(doc As MSXML2.DOMDocument60, nodeName As String, ns As String) As IXMLDOMElement Set CreateNSNode = doc.createNode(NODE_ELEMENT, nodeName, ns) End Function
内容的提问来源于stack exchange,提问作者J0eBl4ck
相关产品推荐
相关产品推荐

