0

假设我有一个这样的 XML 代码:

<a>
 <na:Data xmlns:na="http://some_site.com#" Ref="http://another_site.com" 
  Key="value">
  <b>
  <c>some_c_attrib</c>
  <d>some_d_attrib</d>
  <e>some_e_attrib</e>
   <f>some_f_attrib</f>
   <g>some_g_attrib</g>
  </b>
  <h>
   <i>some_i_attrib</i>
   <j>some_j_attrib</j>
  </h>
 </na:Data>
 <da:Newtag xmlns:da="http://new_site.com">
  <k name="http://new_new_site.com"/>

在此之后还有几行。我已经使用解析了 xml ET.parse(FILENAME),然后使用write_c14n("new.xml"). 我现在想将这个 new.xml 的一部分提取到另一个 xml 文件中,我只想要从 开始<na:Data xmlns:na="http://some_site.com#" Ref="http://another_site.com" Key="value">和结束的部分</h>

但是,我不想使用tostring()它,因为它不保留通过 using 获得的 xml 的规范化write_c14n()。我想知道是否仅从 new.xml 复制该部分并将其写入另一个 xml 是否会有所帮助,但我想它会在两者之间添加一些额外的新行,并且也不会保留 xml 的格式。

我尝试了以下方法:

通过这种方式,我尝试使用新根创建另一个 xml <na:Data xmlns:na="http://some_site.com#" Ref="http://another_site.com" Key="value">

from lxml import etree
from io import StringIO, BytesIO
import xml.etree.ElementTree as et
import xml.etree.ElementTree as xml
from xml.etree import ElementTree as ET

tree = etree.parse('file_location/file_to_read.xml')
root = tree.getroot()

sub_root = etree.Element('{http://some_site.com#}Data')
for node in root.find('.//na:Data', namespaces = {'na':'http://some_site.com#'}).getchildren():


    sub_root.append(node.element)

new_tree = etree.ElementTree(sub_root)

我只需要 new_tree 的对象,所以我可以将它用作 new_tree。tostring()但是,如果我使用[ie print ]打印上面的 new_tree,etree.tostring(root_tree,pretty_print=True)这就是我得到的输出:

<ns0:Data xmlns:ns0="http://some_site.com#"><b>
 <c>some_c_attrib</c>
 <d>some_d_attrib</d>
 <e>some_e_attrib</e>
  <f>some_f_attrib</f>
  <g>some_g_attrib</g>
 </b>
 <h>
  <i>some_i_attrib</i>
  <j>some_j_attrib</j>
 </h>
</ns0:Data>

正如你所看到的,它的键和值 ( ) 都na:Data被替换了。我需要一种可以提取部分 xml 的方法,因为它具有所有属性、键和值。ns0:DataRef="http://another_site.com" Key="value"

4

1 回答 1

0

无需创建新元素。只需解析原始 XML 文件,提取na:Data子元素,然后将其写入新文件。

from lxml import etree

tree = etree.parse('file_location/file_to_read.xml')
Data = tree.find('.//na:Data', namespaces={'na':'http://some_site.com#'})
etree.ElementTree(Data).write_c14n("new.xml")
于 2017-12-10T09:42:40.930 回答