如何获取平面XML以便将外部实体合并到顶层

Kim*_*ais 6 python xml bash editor sed

我知道这是一个边缘情况,它是否真的属于stackoverflow或超级用户,但因为这里似乎有很多"编辑代码"问题,我在SO上发布它.

我有一堆XML文件,他们无限智慧的人决定使用标签爆炸到多个文件,结果使调试/编辑它们成为巨大的PitA.因此我在寻找:

  1. VIM在单个缓冲区中打开它们的方法(最好是将更改保存在正确的外部实体文件中),或者;
  2. 一种扩展VIM中文件的方法,以便在缓冲区中读取和替换外部实体,或者;
  3. 一个简单的bash/sed/python方法在命令行(或.vimrc)中执行此操作

顶级包含的文件可能包括新文件等等,谁知道有多少级别,所以这需要递归...

这是关于顶级文件的样本示例:

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE foobar PUBLIC "foobar:dtd" "foobar.dtd" [

        <!ENTITY foo SYSTEM "foo.xml">

        <!ENTITY bar SYSTEM "bar.xml">
]>
<foo>
        <params>
                &foo;
        </params>
        <bar>
                &bar;
        </bar>
</foo>
Run Code Online (Sandbox Code Playgroud)

编辑:列表按优先顺序排列 - 如果没有1.或2.解决方案可用,赏金最好的#3 ...

编辑2:看起来@Gaby的答案有效,但不幸的是只是部分,除非我做错了 - 我会用他的答案写一些工具并在此处发布以进行改进.当然,#1或#2解决方案将不胜感激...... :)

编辑3:好的,最好的非Emacs -answer将获得赏金;)

结论:感谢@hcayless,我现在有一个工作#2解决方案,我补充说:

autocmd BufReadPost,FileReadPost *.xml silent %!xmllint --noent - 2> /dev/null
Run Code Online (Sandbox Code Playgroud)

对我而言.vimrc,一切都是笨拙的.

小智 5

如果您安装了libxml2,那么xmllint可能会为您执行此操作.根据您的设置,您可能需要更多参数,但对于您的示例,

xmllint --noent foobar.xml
Run Code Online (Sandbox Code Playgroud)

将所有实体解析后,将文件打印到stdout.应该很容易包装一些bash脚本来做它你需要的东西.