Вложите xmlDoc в существующий xmlTextWriter - PullRequest
0 голосов
/ 26 ноября 2018

Я думаю, что упускаю что-то тривиальное, но я теряю кучу времени на это, поэтому его решение может быть полезным и для других:

Я работаю с libxml2 2.9.8 (pureC, а не C ++ привязки) под LinuxУ меня есть внешняя (не libxml) древовидная структура, представляющая файл XML, и я пытаюсь записать в строковое представление, используя libxml2.Все это тривиально и хорошо работает, обходя его и записывая с помощью xmlTextWriter API (это структура с простыми атрибутами, например

 typedef struct _simplifiedNode {
    char *tag,
    char *content,
    struct _simplifiedNode *parent,
    struct _simplifiedNodeList *children,
 } simplifiedNode;

), за исключением того, что в определенный момент я сталкиваюсь с строковым узлом, который может содержатьстроковое представление документа xml.Я могу разобрать его с помощью xmlReadMemory API, но затем мне нужно вложить его (а не его экранированное строковое представление) в непрерывную запись, включая пространства имен и атрибуты.

Есть ли тривиальный способя не могу сделать это рекурсивно, имея проанализированный элемент doc / root, не анализируя каждый подэлемент?

например,

Я создаю следующий документ, используя xmlTextWriter API

<Title>
    TitleValue
</Title>
<Date>
    2018-11-26
</Date>
<Content>

Узел Content в не-libxml дереве - это листовой узел с тегом Content, содержащий строку типа

char *content = "<SomeXmlComplexDocument ss:someattr=\"attrval\">Somecontent</SomeXmlComplexDocument>"

То, чего я хочу достичь, вместо того, чтобы иметь что-то вроде

<Content>&lt;SomeXmlComplexDocument&gt; ... </Content>

после анализа и проверки содержимого с помощью xmlReadMemory для повторного внедрения документа с получением

<Content>
    <SomeXmlComplexDocument ss:someattr="attrval">Somecontent</SomeXmlComplexDocument>
</Content>

пространств имен и атрибутов должны быть сохранены.

1 Ответ

0 голосов
/ 03 декабря 2018

Чтобы сериализовать неэкранированные внутренние фрагменты XML, вы можете просто использовать xmlTextWriterWriteRaw.Это не будет проверять, правильно ли сформирован XML.Если вам нужна проверка, вам придется проанализировать фрагменты XML в какой-то момент.В зависимости от модели содержимого может потребоваться использовать xmlParseBalancedChunkMemory вместо xmlReadMemory.Также должна быть возможность проанализировать результирующий документ за один раз после того, как он был написан, но вы потеряете информацию, такую ​​как исходные номера строк.

...