我正在尝试打开一个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>
我需要删除<copyright_cline>
代码和<title>
代码。然后,我需要将<provider>
代码移到<video>
代码中,并将其放在<original_spoken_locale>
代码下方,并将<release_date>
代码移到<video>
下方} tag。
以下是导出的xml:
<?xml version="1.0" encoding="UTF-8"?>
<package>
<language>en-GB</language>
<video>
<original_spoken_locale>en-US</original_spoken_locale>
<provider>testprovider</provider>
<release_date>2012-04-23</release_date>
</video>
<release_date>2012-04-23</release_date>
</package>
我现在已经成功安装了lxml,因此理想地寻找解决方案。
亲切的问候。
我已经能够删除不需要的标签及其内容,但仍需要能够重新排序/移动其他标签,最好不要更换。我也无法删除这行xml代码“
<!--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")
所以我仍然需要删除<!--Carpet ID: fd54678-->
标记。我想通过通配符删除这些,因为有很多<!--.*-->
,因为中间的内容会发生变化。我还需要知道如何移动标签块。
答案 0 :(得分:1)
由于还没有人回答,我会试试;但我要从阅读而不是实验。如果我错过任何事情,请提前道歉......
有关如何移动元素,请参阅Move an entire element in with lxml.etree
如上所述,要特别小心,因为文本节点在lxml中是而不是节点(见下文)。
至于评论,我在lxml中找不到任何方式来获取评论或直接“移动”元素。你可以先用“sed”或其他东西剥离它们。
注意事项
Elementtree和lxml似乎热衷于只有一种节点。这有一些可能有问题的后果(“事情应该尽可能简单,但不能简单”):
使用注释(如本例所示)或PI更难,因为它们不是模型中的第一类概念。
文本特别困难,因为lxml和elementtree将文本跟随跟随任何XML元素的结束标记,进入该元素的属性(“尾文本”)。它被视为与该元素的类型名称,属性和子项相同。这可以是一种工作(它是图灵机,你知道),但它需要完全不同的思维方式。
我注意到关于lxml的作者经常声明它主要用于真正没有太多文本的XML结构。你给出的例子就是这样的;如果是这样,你很幸运。但是当文本很重要时,即使是这样简单的事情:
<p>As everyone<footnote>Well, almost everyone</footnote> knows...</p>
文本“know ...”是&lt; footnote&gt;的一部分。 lxml中的节点。当您移动或删除或替换脚注时,文本随之而来。但当然,文本不是脚注的一部分(它毕竟是在脚注结束后发生的)。
我不知道lxml对“As everyone”的影响是什么 - 它不会在任何元素结束后出现。我找不到关于lxml如何处理它的任何内容。
如果在任何地方都有任何文字内容,请务必小心。