MSXML为子元素添加默认空xmlns的问题及解决求助
解决MSXML2创建XML时子元素自动添加空xmlns属性的问题
问题出在创建子元素时未指定与根元素相同的命名空间,导致MSXML将子元素归为无命名空间范畴,进而自动添加xmlns=""来明确其不属于父元素的命名空间,违反XSD验证规则。
修复方案:创建元素时指定命名空间
不要通过setAttribute手动设置根元素的命名空间,而是在创建每个元素时直接指定目标命名空间,让子元素自动继承根元素的命名空间,避免空xmlns属性生成。
修改后的VBA代码:
Dim Document As Object Set Document = CreateObject("MSXML2.DOMDocument.6.0") Document.async = False Document.validateOnParse = True ' 可选:开启解析时验证,提前发现问题 Dim ns As String ns = "urn:StandardAuditFile-Taxation-CashRegister:DK" ' 创建带命名空间的根元素 Dim AuditRoot As Object Set AuditRoot = Document.createElement("auditfile", ns) Document.appendChild AuditRoot ' 创建同命名空间的子元素 Set headerRoot = Document.createElement("header", ns) AuditRoot.appendChild headerRoot Set companyRoot = Document.createElement("company", ns) AuditRoot.appendChild companyRoot ' 保存XML文件 Document.Save "c:\Diamond\XML\SAT-T.xml" MsgBox "File created at default location: C:\Diamond\XML\SAT-T.xml"
原理说明
- 当元素创建时指定了命名空间,MSXML会自动识别其与父元素的命名空间一致性,无需额外声明
xmlns。 - 若创建元素时未指定命名空间,即使父元素有命名空间,MSXML也会默认该元素属于无命名空间,强制添加
xmlns=""来区分,这就是导致验证失败的原因。
内容的提问来源于stack exchange,提问作者Melonendk
相关产品推荐
相关产品推荐

