Shell 合并两个xml并保留基本xml的属性值

Shell 合并两个xml并保留基本xml的属性值,shell,merge,Shell,Merge,我有两个如下所示的XML。如何使用脚本将其中两个合并,以从new.xml获取值&从base.xml保留不存在的属性值 base.xml: 使用paste时,只需现场粘贴,vimdiff显示diff,但不允许选择。是否存在任何内置支持,或者是否需要使用sed+awk替换来实现 这里是Python中的一个直接实现: !/usr/bin/env python Python 2.5+兼容 导入系统 将xml.etree.ElementTree作为etree导入 def主: 输出文件=getattrsys

我有两个如下所示的XML。如何使用脚本将其中两个合并,以从new.xml获取值&从base.xml保留不存在的属性值

base.xml:


使用paste时,只需现场粘贴,vimdiff显示diff,但不允许选择。是否存在任何内置支持,或者是否需要使用sed+awk替换来实现

这里是Python中的一个直接实现:

!/usr/bin/env python Python 2.5+兼容 导入系统 将xml.etree.ElementTree作为etree导入 def主: 输出文件=getattrsys.stdout,'buffer',sys.stdout dict2xmlmerge_dicts*mapxml2dict,sys.argv[1:],输出_文件 def xml2dictsource: 返回dictel.get'name',el.attrib 对于etree.parsesource.getiterator'element'中的el def merge_dictsbase,新增: 合并={} 对于新xml中的每个元素 对于名称,在new.items中使用attr: 将基本XML和新XML中的属性组合在一起,首选新值 d=merged[name]=base.getname,{} d、 更新技术 返回合并 def dict2xmld,水槽: root=etree.Element'root' 对于名称,d项中的属性: etree.SubElementroot,“元素”,属性 etree.ElementTreeroot.WriteLink,编码为='utf-8' 主要的 保存此代码以合并xml文件并运行chmod+x合并xml。然后:

$./merge xml base.xml new.xml>merge.xml 以下是与Python 2.4+兼容的版本:

!/usr/bin/env python 导入系统 从xml.dom导入minidom def主: 输出文件=getattrsys.stdout,'buffer',sys.stdout dict2xmlmerge_dicts*mapxml2dict,sys.argv[1:],输出_文件 def xml2dictsource: doc=minidom.parsesource 返回dictel.getAttribute'name',attr2dictel.attributes 对于文档getElementsByTagName'element'中的el def ATTRICT2DICTNODEMAP: d={} 对于rangenodemap.length中的i: attr=nodemap.itemi d[attr.name]=attr.value 返回d def merge_dictsbase,新增: 合并={} 对于新xml中的每个元素 对于名称,在new.items中使用attr: 将基本XML和新XML中的属性组合在一起,首选新值 d=merged[name]=base.getname,{} d、 更新技术 返回合并 def dict2xmld,水槽: doc=minidom.getdoimplementation.createDocumentNone,root,None root=doc.documentElement 对于名称,d项中的属性: el=doc.createElement'element' 对于名称,attr.items中的值: el.setAttributename,值 附子根 sink.writedoc.toprettyxmlencoding='utf-8' 主要的
您将无法使用shell脚本执行此操作。或者你可以,但这将是可笑的复杂。您需要完整的脚本语言和XML解析器。我投票决定将其迁移到。xml文档的结构是什么?除此之外还有其他因素吗?如何匹配base.xml和new.xml中的元素?按他们的命令?i、 e.base.xml中的第一个元素对应于new.xml中的第一个元素,等等,还有更多的元素和类型。映射应该基于元素名称进行,如上面的“ind”。是否有根元素或只是一个元素序列,例如,每行一个元素?每个文件中的名称是否唯一?是的,XML中有一个根元素。每个元素的名称在完整的XML中都是唯一的。我尝试使用上面的python脚本,但是我得到了:File./merge XML,etree.parsesource.iter'element'}^SyntaxError:invalid syntax$ls/usr/bin/python/usr/bin/python*使用python2.7运行脚本我可以看到它的2.4版本&我尝试过:/脚本的第一行中的usr/bin/env/usr/bin/python2.4仍然会看到相同的错误。我需要等到2.7得到安装,如果该版本是强制运行脚本在我的工作控制environment@user1587504:我添加了与Python 2.4兼容的解决方案
 <element name="ind"
          dbs="name1, name2, name4"
          server="ServerName"
          good-attribute="234"/>  
<element name="ind"
         description="My desc"
         dbId="someId"
         moreAttr="someVal"
         dbs="name1, name2, name4, name12, name3"
         server="ServerName" />
<element name="ind"
         description="My desc"
         dbId="someId"
         moreAttr="someVal"
         dbs="name1, name2, name4, name12, name3"
         server="ServerName"
         good-attribute="234" />