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

Python 如何获取平面XML,以便将外部实体合并到顶层,python,xml,bash,editor,sed,Python,Xml,Bash,Editor,Sed,我知道这是一个边缘的情况,无论它真的属于stackoverflow还是superuser,但因为这里似乎有很多“编辑代码”的问题,我把它贴在上面 我有一堆XML文件,有人以其无限的智慧决定使用标记将其分解为多个文件,这使得调试/编辑它们成为一个巨大的p-I-t-a。因此,我正在寻找: VIM中在单个缓冲区中打开它们的方法(最好将更改保存在正确的外部实体文件中),或 在VIM中扩展文件的方法,以便在缓冲区中读取和替换外部实体,或 一种简单的bash/sed/python方法,可以在命令行(或在.v

我知道这是一个边缘的情况,无论它真的属于stackoverflow还是superuser,但因为这里似乎有很多“编辑代码”的问题,我把它贴在上面

我有一堆XML文件,有人以其无限的智慧决定使用标记将其分解为多个文件,这使得调试/编辑它们成为一个巨大的p-I-t-a。因此,我正在寻找:

  • VIM中在单个缓冲区中打开它们的方法(最好将更改保存在正确的外部实体文件中),或
  • 在VIM中扩展文件的方法,以便在缓冲区中读取和替换外部实体,或
  • 一种简单的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>
    
    对于我的
    .vimrc
    ,一切都很好。

    对于#3选项,您可以查看 请参阅

    DOM配置参数

    解析操作的结果 取决于在上设置的参数 LSParser.domConfig映射。通过 默认值,根据DOM 规范,所有CDATA部分都将 将替换为纯文本节点和 所有绑定的实体引用都将被删除 替换为实体的内容 参考。这包括外部 实体引用和外部 子集


    它包括将文档保存到文件的序列化程序。

    您正在寻找类似的内容吗

    #!/opt/local/bin/python
    import sys
    if len(sys.argv) < 2:
        print "some files needed."
        sys.exit()
    
    final = """
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <nodes>
    """
    for a in sys.argv[1:]:
        ca = a.replace(".xml","")
        final += "<" + ca + ">\n"
        infile = open(a)
        final += infile.read()
        final += "</" + ca + ">\n"  
    
    final += "</nodes>\n"
    
    outfile = open("final.xml", "w")
    outfile.write(final)
    outfile.close()
    
    #/opt/local/bin/python
    导入系统
    如果len(系统argv)<2:
    打印“需要的一些文件”
    sys.exit()
    final=”“”
    """
    对于sys.argv[1:]中的
    ca=a.replace(“.xml”,”)
    最终+=“\n”
    填充=打开(a)
    final+=infle.read()
    最终+=“\n”
    最终+=“\n”
    outfile=open(“final.xml”,“w”)
    输出文件写入(最终)
    outfile.close()
    
    如果您安装了libxml2,那么xmllint可能会为您这样做。根据您的设置,您可能需要更多参数,但对于您的示例

    xmllint --noent foobar.xml
    

    将文件打印到标准输出,并解析所有实体。围绕它编写一些bash脚本应该很容易,以满足您的需要。

    这可以用xslt来完成吗?我以前没有看到过这一点,但很显然,它是XML的一部分。这是我找到的一个解释。是的,它是有效的,因此是恼人的两倍:)我可以帮你做3,但它必须是可逆的吗?或者一次性解决方案会有帮助吗(现在扩展,永远不要回到旧系统)。任何帮助都是值得赞赏的,可逆性将是一种奖励,但如果没有1或2个解决方案,则不可逆的3将必须……工作得很好。谢谢现在,我只需要在打开.xml文件时在.vimrc中自动添加这个。
    xmllint --noent foobar.xml