2012-05-03 4 views
3

libxml2 (для C) не сохраняет пустые элементы в их первоначальной форме при сохранении. Он заменяет <tag></tag><tag/>, что является технически корректным, но вызывает проблемы у нас.libxml2 сохранить пустые теги

xmlDocPtr doc = xmlParseFile("myfile.xml"); 
xmlNodePtr root = xmlSaveFile("mynewfile.xml", doc); 

Я пытался играть с различными вариантами (с использованием xlmReadFile), но никто, кажется, не влияет на выход. В одном из сообщений упоминалось об отключении тегирования, но пример был для PERL, и я не нашел аналога для C.

Есть ли возможность отключить это поведение?

+0

возможно дубликат [(пар тегов преобразования пустых элементов, чтобы начать конец) Как конвертировать в с Libxml] (http://stackoverflow.com/вопросы/11005902/как к обращенным-узел-узел-узел-с-Libxml-превращающего пустые-элементы-т) –

ответ

3

Просто нашел enum в xmlsave module documentation:

Enum xmlSaveOption { 
    XML_SAVE_FORMAT = 1 : format save output 
    XML_SAVE_NO_DECL = 2 : drop the xml declaration 
    XML_SAVE_NO_EMPTY = 4 : no empty tags 
    XML_SAVE_NO_XHTML = 8 : disable XHTML1 specific rules 
    XML_SAVE_XHTML = 16 : force XHTML1 specific rules 
    XML_SAVE_AS_XML = 32 : force XML serialization on HTML doc 
    XML_SAVE_AS_HTML = 64 : force HTML serialization on XML doc 
    XML_SAVE_WSNONSIG = 128 : format with non-significant whitespace 
} 

Может быть, вы можете реорганизовывать приложение, чтобы использовать этот модуль для сериализации, и немного поиграть с этими параметрами. Специально с XML_SAVE_NO_EMPTY.

0

Ваш код может выглядеть следующим образом:

xmlSaveCtxt *ctxt = xmlSaveToFilename("mynewfile.xml", "UTF-8", XML_SAVE_FORMAT | XML_SAVE_NO_EMPTY); 
if (!ctxt || xmlSaveDoc(ctxt, doc) < 0 || xmlSaveClose(ctxt) < 0) 
    //...deal with the error 
Смежные вопросы