如何让xerces -c以最小的开销来编写命名空间?

时间:2018-05-29 13:43:53

标签: xml xerces-c

我用xerces-c 3.2.1写了一个xml文件,看起来像

<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<Test xmlns="my_namespace" 
      xmlns:xml="http://www.w3.org/XML/1998/namespace" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="my_namespace myschema.xsd">
        <Elem />
</Test>

使用我自己的默认命名空间并声明 xml xsi 命名空间。

在我的命名空间中,我有一个名为 dim 的属性,需要一个名称空间声明,否则它会与预先存在的 xml 混合:dim。

当我设置此属性时 elem->setAttributeNS("my_namespace", "myprefix:dim", data); 然后我的xml文件看起来像

<?xml version="1.0" encoding="UTF-16" standalone="yes" ?>
<Test xmlns="my_namespace" 
      xmlns:xml="http://www.w3.org/XML/1998/namespace" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="my_namespace myschema.xsd">
         <Elem xmlns:myprefix="my_namespace" myprefix:dim="..."/>
</Test>

在每个使用 dim 属性的每个元素上使用命名空间声明我写的,这很糟糕,因为出于文件大小的原因,我想要xerces-c写文件

黄金

<Test xmlns="my_namespace" 
      xmlns:myprefix="my_namespace" 
      xmlns:xml="http://www.w3.org/XML/1998/namespace" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="my_namespace myschema.xsd">
         <Elem myprefix:dim="..."/>
</Test>

在根节点处使用名称空间前缀声明。但是如果我使用root->setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:myprefix", "my_namespace");

将这样的条目添加到根节点

然后xerces -c生成像

这样的xml文件
    <Test xmlns="my_namespace" 
      xmlns:myprefix="my_namespace" 
      xmlns:xml="http://www.w3.org/XML/1998/namespace" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="my_namespace myschema.xsd">
         <myprefix:Elem1 ../>
         <myprefix:Elem2 ../>
         <Elem myprefix:dim="..."/>
</Test>

前缀所有其他元素 myprefix:elem1 myprefix:elem2 ,但我的 dim 除外这是颈部疼痛...

如何强制xerces-c能够写出最少量的命名空间声明和前缀,如 the golden one ??

1 个答案:

答案 0 :(得分:0)

最后获得黄金的技巧是:

将前缀添加到元素名称(或属性名称),例如 L“ my_prefix:Elem” (除名称空间外)

DOMElement * e4 = doc->createElementNS(defaultNS, (const XMLCh*)L"my_prefix:Elem");
root->appendChild(e4);

这可以节省产生的XML 文件中的空间,但是在生成XML的代码中需要更多空间 :(并且还需要更多代码,因为前缀不应为硬编码的..