2016-10-27 4 views
0

私は2つのXMLファイルを持っています。彼らはかなり似ています。特別な子供の周りに新しい親を置く

最初:

<a> 
    <b /> 
    ... 
    <c e='very important'> 
    <d e='bla' /> 
    <d e='bla' /> 
    </c> 
</a> 

と第二:

<a> 
    <f /> 
    ... 
    <d e='some' /> 
    <d e='values' /> 
</a> 

私は、2番目のXMLを変更する必要が二1に最初のXMLからCタグをコピーして、すべてのを包みますd兄弟がそこにいる。それを行うにはどのように

<a> 
    <f /> 
    ... 
    <c e='very important'> 
    <d e='some' /> 
    <d e='values' /> 
    </c> 
</a> 

:私はそのような何かを得るしたいですか?

import xml.etree.ElementTree as ET 

f_tree = ET.parse(f_file) 
s_tree = ET.parse(s_file) 
f_root = f_tree.getroot() 
s_root = s_tree.getroot() 

one_c = f_root.find('c') 
all_d = s_root.findall('d') 

for child in one_c: 
    one_c.remove(child) 

for the_d in all_d: 
    one_c.append(the_d) 
+1

コードの記述方法です。ここで質問する前に行うことをお勧めします。 – kjhughes

+0

私が解決できるのは、__c__タグと__d__タグをすべて見つけることだけです。しかし、私は正しい場所に__c__を置く方法を想像しません。 –

+3

@PeterNegeはあなたがしたことを共有することが奨励されています。 –

答えて

0

Pythonのを使用してXSLT 1.0のソリューションを検討し、ロジックまたはコピーツリーをループ伴うことがビルトインxml.etreeと解決策があるかもしれないが:

私の試みは乏しいです

EDITサードパーティのモジュールlxml

背景として、XPathを含むXSLファミリの一部であるXSLTは、XMLドキュメントの変換に使用される特殊目的の言語です。 XSLTは、document()関数を保持しており、現在のXMLソースとの相対的なドキュメント間でXPath式を作成できます。

以下は、すべてのXML文書とXSL文書が同じディレクトリにあることを前提としています。また、示されているように、XSLTスクリプトは整形式のXMLファイルであり、他のXMLと同様に解析できます。

XSLTスクリプト(の.xslまたは.xsltファイルとして保存)

<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
<xsl:output version="1.0" encoding="UTF-8" indent="yes" /> 
<xsl:strip-space elements="*"/> 

    <xsl:template match="@*|node()"> 
    <xsl:copy> 
     <xsl:apply-templates select="@*|node()"/> 
    </xsl:copy> 
    </xsl:template> 

    <xsl:template match="a"> 
    <xsl:copy> 
     <xsl:copy-of select="*[local-name()!='d']"/>  
     <c> 
      <xsl:copy-of select="document('f_file.xml')/a/c/@*"/> 
      <xsl:copy-of select="d"/> 
     </c> 
    </xsl:copy> 
    </xsl:template> 

</xsl:transform> 

のPythonスクリプト

import os 
import lxml.etree as ET 

f_tree = ET.parse('f_file.xml') 
s_tree = ET.parse('s_file.xml') 

xslt = ET.parse('XSLT_Script.xsl') 

transform = ET.XSLT(xslt) 
newdom = transform(s_tree) 

# PRINT TO SCREEN 
print(newdom) 

# <?xml version="1.0"?> 
# <a> 
# <f/> 
# <other/> 
# <c e="very important"> 
#  <d e="some"/> 
#  <d e="values"/> 
# </c> 
# </a> 

# OUTPUT TO FILE 
with open('Output.xml', 'wb') as f: 
    f.write(newdom) 
関連する問題