2016-10-27 1 views
0

У меня есть два файла XML. Они очень похожи.положить нового родителя вокруг специальных детей

первый:

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

и второй:

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

я должен изменить второй XML, скопируйте гр тег из первого XML в второй и обернуть все d братья и сестры там с ним. Я хочу получить что-то вроде этого:

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

Как это сделать?

EDIT

Мои попытки скудны:

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

Хотя может быть решением со встроенным xml.etree, которые могут включать в себя цикл логики или копирование деревьев, рассмотрим решение XSLT 1.0 с помощью языка Python сторонний модуль, lxml.

В качестве фона часть семейства XSL, включающая XPath, XSLT, является языком специального назначения, используемым для преобразования документов XML. XSLT поддерживает функцию document(), позволяющую создавать выражения XPath в документах относительно текущего источника XML.

Ниже предполагается, что все документы 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) 
Смежные вопросы