【问题标题】:How to get xerces-c to write namespaces with minimum size overhead?如何让 xerces-c 以最小的大小开销编写命名空间?
【发布时间】:2018-05-29 13:43:53
【问题描述】:

我用 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>

使用我自己的默认命名空间以及声明的 xmlxsi 命名空间。

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

当我设置这个属性时 elem-&gt;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-&gt;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:elem1myprefix:elem2,除了带有我的dim的元素,这是脖子痛...

我如何强制 xerces-c 写出最少数量的命名空间声明和前缀,就像 golden one 一样??

【问题讨论】:

    标签: xml xerces-c


    【解决方案1】:

    最后,获得金牌的诀窍是:

    为元素名称添加前缀(或属性名称),例如L"my_prefix:Elem"(除了命名空间)

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 2016-07-04
      • 2023-03-02
      • 2017-10-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多