使用libxml保存带有外部实体的XML文件,而不合并为一个

时间:2016-09-29 19:25:53

标签: xml libxml2

我的应用程序从XML加载配置并使用以实体形式读入的多个文件,但是当我将文档保存回来时,它将所有文件合并为一个。这不是最糟糕的事情,但如果更改最终出现在单独的实体中会更好。我愿意使用XSD语法而不是DTD,如果这是一个选项,我想尽可能避免,但必须将每个文件作为单独的文档加载并手动组合。

示例配置:

<?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);

也许有一个中间步骤使用我没见过的作家。

1 个答案:

答案 0 :(得分:0)

第一步是删除NOENT选项,禁用&sec;的扩展。如果没有NOENT,您必须手动处理实体节点。但是对于NOENT,实体在解析期间被替换,这是不可逆的。也许在你的情况下有助于解析文档两次,一次使用和一次没有NOENT?