2012-05-03 23 views
3

libxml2(for C)は、保存時に元の形式で空の要素を保存していません。それは<tag></tag><tag/>に置き換えます。これは技術的には正しいものの、問題を引き起こします。libxml2空のタグを保持

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

私はさまざまなオプション(xlmReadFileを使用して)で遊んで試してみたが、どれも出力に影響を与えるように思いません。ここで1つの投稿はタグ圧縮を無効にすると述べていましたが、例はPERL用で、Cのアナログは見つかりませんでした。

この動作を無効にするオプションはありますか?

+0

の可能重複[のlibxmlとに​​を変換する方法(空の要素を変換開始終了タグのペア)](http://stackoverflow.com/questions/11005902/how-to-convert-node-to-node-node-with-libxml-converting-empty-elements-t) –

答えて

3

ちょうどxmlsave module documentationでこのenumを見つけました:

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 
関連する問題