gpt4 book ai didi

winapi - 如何将命名空间添加到 msxml DOMDocument?

转载 作者:行者123 更新时间:2023-12-03 22:44:33 24 4
gpt4 key购买 nike

我如何将架构添加到 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属性。

命名空间URI属性

我尝试设置 namespaceURI Relationships 的属性(property)元素:
relationshps.namespaceURI := "http://schemas.openxmlformats.org/package/2006/relationships"; 

但该属性是只读的。

模式属性

该文档确实有 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;

但这导致没有 xmlns被发射。

所以现在我放弃并询问 Stackoverflow。

与其尝试以正确的方式构建 XML 文档,我总是可以使用 StringBuilder手动构建 XML,然后将其解析为 XML Document 对象。

但我宁愿以正确的方式去做。

最佳答案

诀窍是实现 W3C DOM Level 2 和 3 有一个方法 createElementNS 🕗 :

Creates an element with the specified namespace URI and qualified name.

Syntax

element = document.createElementNS(namespaceURI, qualifiedName);



但是 MSXML 6 只支持 DOM Level 1。

幸运的是,W3C DOM Level 1 确实有一个方法来创建一个带有命名空间的元素: createNode 🕗 :

Creates a node using the supplied type, name, and namespace.

HRESULT createNode(VARIANT Type, BSTR name, BSTR namespaceURI, out IXMLDOMNode node);


因此我的解决方案是我必须改变:
relationships: IXMLDOMElement = doc.createElement("Relationships"); 

进入:
const NODE_ELEMENT: Integer = 1;
const ns: string = "http://schemas.openxmlformats.org/package/2006/relationships";

relationships: IXMLDOMElement = doc.createNode(NODE_ELEMENT, "Relationships", namespace);

一个糟糕的部分是每个元素都必须在该命名空间中创建:
function AddElementNS(IXMLDOMNode parentNode, String tagName, String namespaceURI): IXMLDOMElement;
{
doc: IXMLDOMDocument = parentNode as IXMLDOMDocument;
if (doc == null)
doc = parentNode.ownerDocument;

if (namespaceURI <> "")
Result = doc.createNode(NODE_ELEMENT, tagName, namespaceURI)
else
Result = doc.createElement(tagName);

parentNode.appendChild(Result);
}

relationships: IXMLDOMElement = AddElementNS(doc, "Relationships", ns);

relationship: IXMLDOMElement = AddElementNS(relationships, "Relationship", ns);
relationship.setAttribute("Id", "rId1");
relationship.setAttribute("Type", "Frob");
relationship.setAttribute("Target", "Grob");

奖励阅读
  • Creating XML with namespaces with Javascript and MSXML 🕗
  • 关于winapi - 如何将命名空间添加到 msxml DOMDocument?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36022072/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com