我需要创建包含多个名称空间的XML文件。 我使用默认命名空间创建根元素,然后添加另一个 命名空间(" otherNS")和setAttribute()。
问题是,当我插入一个前缀为" otherNS"的元素(带有createElement())时, xerces添加一个空的命名空间属性。当我使用createElementNS()并显式声明otherNS URI时,xerces会添加完整的URI属性。 在我对XML命名空间的理解中,两者都是错误的。 (也是中的例子 http://www.w3schools.com/Xml/xml_namespaces.asp不要在每个元素中重复命名空间属性。)
这是一个示例输出:
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<company xmlns="http://default.namespace.org/NS" xmlns:otherNS="http://other.namespace.org/ONS">
<otherNS:product xmlns="">Xerces-C</otherNS:product>
<otherNS:category xmlns:otherNS="http://other.namespace.org/ONS" idea="great">XML Parsing Tools</otherNS:category>
<developedBy xmlns="">Apache Software Foundation</developedBy>
</company>
这是代码:
DOMDocument* doc = impl->createDocument(
X("http://default.namespace.org/NS"),
X("company"),
0);
DOMElement* rootElem = doc->getDocumentElement();
rootElem->setAttribute(
X("xmlns:otherNS"),
X("http://other.namespace.org/ONS"));
DOMElement* prodElem = doc->createElement(X("otherNS:product"));
rootElem->appendChild(prodElem);
DOMText* prodDataVal = doc->createTextNode(X("Xerces-C"));
prodElem->appendChild(prodDataVal);
DOMElement* catElem = doc->createElementNS(
X("http://other.namespace.org/ONS"),
X("otherNS:category"));
rootElem->appendChild(catElem);
我的问题是:
答案 0 :(得分:2)
我在Xerces mailing list上找到了解决方案:
替换:
rootElem->setAttribute(
X("xmlns:otherNS"),
X("http://other.namespace.org/ONS"));
使用:
rootElem->setAttributeNS(X("http://www.w3.org/2000/xmlns/"),
X("xmlns:otherNS"),
X("http://other.namespace.org/ONS"));
原因:命名空间定义本身必须位于xmlns命名空间中,因此必须使用setAttributeNS()方法。