Python-lxml删除一些xml标记并移动其他标记

Python-lxml删除一些xml标记并移动其他标记,xml,tags,lxml,Xml,Tags,Lxml,我试图打开一个xml,删除整个标记及其内容,并在xml中移动其他标记 以下是我的原始导入xml: <?xml version="1.0" encoding="UTF-8"?> <package> <language>en-GB</language> <video> <original_spoken_locale>en-US</original_spoken_locale>

我试图打开一个xml,删除整个标记及其内容,并在xml中移动其他标记

以下是我的原始导入xml:

<?xml version="1.0" encoding="UTF-8"?>
<package>
    <language>en-GB</language>
    <video>
        <original_spoken_locale>en-US</original_spoken_locale>
        <copyright_cline>2012 copyright</copyright_cline>
        <release_date>2012-04-23</release_date>
        <title>Amazing Film</title>
    </video>
    <provider>testprovider</provider>
</package>

因此,我仍然需要删除
标记。我想通过通配符删除这些,因为有许多代码> >代码>,因为中间的内容会发生变化。我还需要知道如何移动标记块。

因为还没有其他人回答,我会尝试;但我要从阅读开始,而不是从实验开始。如果我错过了什么,请提前道歉

有关如何移动图元,请参见

如上所述,要特别小心,因为文本节点不是lxml中的节点(见下文)

至于注释,我在lxml中找不到任何方法来获取注释,或者直接“移动”元素。你可以先用“sed”之类的东西把它们脱光

告诫

Elementtree和lxml似乎只希望有一种节点。这会产生一些问题(“事情应该尽可能简单,但不能简单”):

  • 使用注释(如本例中所示)或PI更难,因为它们不是模型中的一流概念

  • 文本尤其困难,因为lxml和elementtree将任何XML元素的结束标记后面的文本转换为该元素的属性(“尾部文本”)。它被视为与元素的类型名称、属性和子元素相同。这可以算是一种工作(你知道,这是一台图灵机),但它需要一种完全不同的思维方式

我注意到,关于lxml的作者经常说,它主要用于真正没有太多文本的XML结构。你举的例子似乎是这样的;如果是这样的话,你很幸运。但当文本很重要时,即使是像这样简单的事情:

 <p>As everyone<footnote>Well, almost everyone</footnote> knows...</p>
大家都知道,几乎每个人都知道

文本“knows…”是lxml中节点的一部分。当您移动、删除或替换脚注时,文本将随之移动。但当然,该文本不是脚注的一部分(毕竟,它发生在脚注结束之后)

我不知道lxml如何处理“作为所有人”——它不会在任何元素结束后出现。我找不到关于lxml如何处理这个问题的任何信息

因此,如果任何地方有任何文本内容,都要非常小心

<!--Carpet ID: fd54678-->
from lxml import etree

xmlFileIn = '/xmls/metadata.xml'
xmlFileOut = '/xmls/output.xml'

tree = etree.parse(xmlFileIn)
root = tree.getroot()

etree.strip_elements(root, 'assets')
etree.strip_tags(root, 'assets')

etree.strip_elements(root, 'chapters')
etree.strip_tags(root, 'chapters')

etree.strip_elements(root, 'xid')
etree.strip_tags(root, 'xid')

# Write the new xml file
tree.write(xmlFileOut, pretty_print=True, xml_declaration=True, encoding="utf-8")
 <p>As everyone<footnote>Well, almost everyone</footnote> knows...</p>