Как заставить xerces-c писать пространства имен с минимальными накладными расходами? - PullRequest
0 голосов
/ 29 мая 2018

Я пишу xml-файл с xerces-c 3.2.1, который выглядит как

<?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 attribute Я пишу, что плохо, потому что по размерам файлов я хотел бы иметь файлы для записи 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 , кроме одного с моим тусклым , который является болью в шее ...

Как я могузаставить xerces-c по своей воле написать минимальное количество объявлений и префиксов пространства имен, как в золотой ??

1 Ответ

0 голосов
/ 24 июля 2018

Наконец, уловка золотой :

до добавляет префикс к имени элемента (или имени атрибута), например, L "my_prefix: Elem " (дополнительно к пространству имен)

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

Это экономит место в результирующем файле XML , но требует больше места вкод, создающий XML :( и требует еще больше кода, так как префикс не должен быть жестко закодирован ..

...