2016-09-29 6 views
0

アプリケーションはXMLから設定を読み込み、複数のファイルをエンティティとして読み込みますが、ドキュメントを保存するとすべてのファイルが1つにまとめられます。これは最悪のことではありませんが、変更が別のエンティティで終了した方が良いでしょう。それがオプションであれば、DTDの代わりにXSD構文を使用したいと思います。できるだけ避けたいのは、各ファイルを別々のドキュメントとしてロードして手動で結合する必要があります。libxmlを使用して外部エンティティでXMLファイルを1つにマージせずに保存する

サンプル設定:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<!DOCTYPE cfg SYSTEM "cfg.dtd" [ 
    <!ENTITY sec SYSTEM "sec.xml"> 
]> 
<cfg> 
    <!-- stuff --> 

    <!-- load external section --> 
    &sec; 

    <!-- more stuff --> 
</cfg> 

と些細な実体ファイルsec.xml FWIW:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<sec> 
    <prop name="myprop">0</prop> 
</sec> 

私は問題ないと思うので、私は、DTDを含めていません。 Valaのを使用して

私はたぶん私は見ていないよライターを使用して中間のステップがあります

doc = Xml.Parser.read_file (file_name, null, 
          Xml.ParserOption.DTDATTR | 
          Xml.ParserOption.NOENT | 
          Xml.ParserOption.DTDVALID) 

ドキュメントをロードし、

doc->save_file (file_name); 

で保存します。

+0

最初の手順は、 'NOENT'オプションを削除し、' &sec; 'の展開を無効にすることです。 – nwellnhof

+0

私はそれが問題の一部であるかもしれないと思ったが、そこになければエンティティをまったく読み込まない。 – geoffjay

+1

はい、 'NOENT'なしでエンティティノードを手動で処理する必要があります。しかし、 'NOENT'では、パース時にエンティティが置き換えられますが、これは可逆ではありません。おそらく、あなたのケースでは、文書を2回、「NOENT」なしで1回、そして1回は解析するのに役立つでしょうか? – nwellnhof

答えて

0

最初の手順では、NOENTオプションを削除し、&sec;の拡張を無効にします。 NOENTがなければ、エンティティノードを手動で処理する必要があります。しかし、NOENTを使用すると、解析中にエンティティが置き換えられますが、これは可逆ではありません。たぶんあなたのケースでは、ドキュメントを2度、1度だけ、そして1度NORSなしで解析するのに役立ちますか?

関連する問題