xerces中的多个XML命名空间

时间:2015-11-06 11:48:51

标签: c++ xml xml-namespaces xerces

我需要创建包含多个名称空间的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);

我的问题是:

  1. 我对Xerces API的使用是否正确?我是否可能必须以不同方式添加第二个命名空间,似乎xerces无法识别它。
  2. 是否有DOMLSSerializer类的任何功能,这些功能会改变这种行为,到目前为止我还没有找到任何功能。

1 个答案:

答案 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()方法。