xml - 为什么这个 XML 属性会引发验证错误,为什么它仍然存在?

标签 xml vba ms-access

我创建了一个 xml-fil 并遇到了问题。我已尽可能简化了代码以显示错误。我的项目中引用了 Microsoft XML 6.0。当我运行这段代码时

Sub simpleTest()
    Dim xDoc As New DOMDocument60
    Dim n0 As IXMLDOMNode
    Dim n1 As IXMLDOMElement
    Dim n2 As IXMLDOMElement
    Dim blValiderad As Boolean
    Const file = "c:\temp\abc.xml"
    
    xDoc.async = False
    xDoc.validateOnParse = False
    xDoc.resolveExternals = False
    xDoc.preserveWhiteSpace = True
    Set n0 = xDoc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
    xDoc.appendChild n0
    Set n1 = xDoc.createElement("Document")
    n1.setAttribute "xmlns", "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
    n1.setAttribute "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"
    Set n2 = xDoc.createElement("CstmrCdtTrfInitn")
    n2.Text = "hello"
    n1.appendChild n2  'CstmrCdtTrfInitn
    xDoc.appendChild n1 'Document
    xDoc.Save file
End Sub

它生成这个 xml 表达式

<?xml version="1.0"?>
<Document xmlns="urn:iso:std:iso:20022:tech:xsd:pain.001.001.03" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<CstmrCdtTrfInitn xmlns="">
hello
</CstmrCdtTrfInitn>
</Document>

验证时会产生此错误:

1072897501; Validate failed because the document does not contain exactly one root node.

问题似乎出在 CstmrCdtTrfInitn 的空属性 xmlns="" 上。当我从文件中删除它时,没有验证错误。为什么会这样?为什么它是由我的代码生成的?

最佳答案

据我了解, CreateElement("some_text")createNode(Type:=NODE_ELEMENT, Name:="some_text", NamespaceURI:="").

由于 NamespaceURI 与父元素不匹配,因此会创建该属性。

相反,使用createNode并指定命名空间:

Dim xDoc As New DOMDocument60
Dim n0 As IXMLDOMNode
Dim n1 As IXMLDOMElement
Dim n2 As IXMLDOMElement
Dim blValiderad As Boolean
Const file = "c:\temp\abc.xml"

xDoc.async = False
xDoc.validateOnParse = False
xDoc.resolveExternals = False
xDoc.preserveWhiteSpace = True
Set n0 = xDoc.createProcessingInstruction("xml", "version='1.0' encoding='UTF-8'")
xDoc.appendChild n0
Set n1 = xDoc.createElement("Document")
n1.setAttribute "xmlns", "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03"
n1.setAttribute "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"
Set n2 = xDoc.createNode(NODE_ELEMENT, "CstmrCdtTrfInitn", "urn:iso:std:iso:20022:tech:xsd:pain.001.001.03")
n2.Text = "hello"
n1.appendChild n2  'CstmrCdtTrfInitn
xDoc.appendChild n1 'Document
Debug.Print xDoc.XML

关于xml - 为什么这个 XML 属性会引发验证错误,为什么它仍然存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71263504/

相关文章:

python - 是否可以运行存储在 xml cdata 中的 python 代码?

html - 创建和理解 XML 转换

php - 显示带有从 mysql 检索到的标记的谷歌地图

excel - 在 Excel VBA 中将文本框中的字符串格式化为 TimeValue

c# - 这个VBA代码会异步执行吗

mysql - MS Access 2010 中基于乘法的数据分组

xml - 如何将 XML::Simple 与可能具有一个或多个子元素的 XML 标记一起使用?

excel - TextToColumns 创建了多少列?

excel - 使用 MS Access VBA 将一行插入 .xlsx 文件...如何避免损坏文件?

sql - 使用excel vba将用户表单数据插入Access表