如何将架构添加到IXMLDOMDocument
?
例如,我想生成 XML:
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="Frob" Target="Grob"/>
</Relationships>
我可以构造 DOMDocument60 对象(伪代码):
DOMDocument60 doc = new DOMDocument60();
IXMLDOMElement relationships = doc.appendChild(doc.createElement("Relationships"));
IXMLDOMElement relationship = relationships.appendChild(doc.createElement("Relationship"));
relationship.setAttribute("Id", "rId1");
relationship.setAttribute("Type", "Frob");
relationship.setAttribute("Target", "Grob");
现在是如何添加命名空间的问题。
如何添加命名空间?
如果我采取明显的解决方案,请在关系节点上设置一个名为xmlns
:
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
通过类似的东西:
relationships.setAttribute("xmlns",
"http://schemas.openxmlformats.org/package/2006/relationships");
保存文档时,会导致生成的 xml 错误:
<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships">
<Relationship Id="rId1" Type="Frob" Target="Grob" xmlns=""/>
</Relationships>
它将空xmlns
属性放置在每个其他元素上。在这个小测试文档中,它只错误地应用了xmlns
一个元素。在现实世界中,有几十个或几百万个具有空xmlns
属性的其他元素。
namespaceURI 属性
我尝试设置元素的namespaceURI
属性:Relationships
relationshps.namespaceURI := "http://schemas.openxmlformats.org/package/2006/relationships";
但该属性是只读的。
schemas 属性
文档确实有一个schemas
属性,它获取或设置一个XMLSchemaCache
对象。但它需要一个实际的模式文档。例如,试图只设置一个模式是行不通的:
schemas = new XMLSchemaCache60();
schemas.add('', 'http://schemas.openxmlformats.org/spreadsheetml/2006/main');
doc.schemas := schemas;
但这会尝试实际加载架构 url,而不是不加载架构,因为它不是 URI。
也许我必须随机尝试其他事情:
schemas = new XMLSchemaCache60();
schemas.add('http://schemas.openxmlformats.org/spreadsheetml/2006/main', null);
doc.schemas := schemas;
但这会导致 noxmlns
被发射。
与其尝试以正确的方式构建 XML 文档,我总是可以使用 aStringBuilder
手动构建 XML,然后将其解析为 XML Document 对象。
但我宁愿以正确的方式去做。