Python 如何获取平面XML,以便将外部实体合并到顶层
我知道这是一个边缘的情况,无论它真的属于stackoverflow还是superuser,但因为这里似乎有很多“编辑代码”的问题,我把它贴在上面 我有一堆XML文件,有人以其无限的智慧决定使用标记将其分解为多个文件,这使得调试/编辑它们成为一个巨大的p-I-t-a。因此,我正在寻找: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
<?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