使用 libxml 保存 XML 个包含外部实体的文件而不合并为一个文件
Saving XML files with external entities using libxml without merging into one
我的应用程序从 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);
也许有一个中间步骤使用了我没有见过的作者。
第一步是删除 NOENT 选项,禁用 &sec;
的扩展。如果没有 NOENT,您必须手动处理实体节点。但是对于 NOENT,实体在解析过程中被替换,这是不可逆的。也许对您的情况有帮助,两次解析文档,一次有 NOENT,一次没有?
我的应用程序从 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);
也许有一个中间步骤使用了我没有见过的作者。
第一步是删除 NOENT 选项,禁用 &sec;
的扩展。如果没有 NOENT,您必须手动处理实体节点。但是对于 NOENT,实体在解析过程中被替换,这是不可逆的。也许对您的情况有帮助,两次解析文档,一次有 NOENT,一次没有?