在Python中使用LXML在Grandchildren Nodes之间插入

时间:2014-10-19 14:06:41

标签: xml parsing python-3.x insert lxml

我正在尝试更新iTunes播客XML,并且需要将信息放在第一个 标记之上。我尝试过使用minidom和lxml.etree,但似乎无法向下钻取足够的距离以便开始插入我需要的地方。这是我最近尝试过的XML和代码,由于lxml将子节点转换为列表,因此会出错。

<?xml version='1.0' encoding='UTF-8'?>
<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0">
   <channel>
    <title>Title</title>
    <link>weblink</link>
    <language>en-us</language>
    <copyright>Copyright</copyright>
    <itunes:subtitle>Subtitle</itunes:subtitle>
    <itunes:author>Author</itunes:author>
    <itunes:summary>Summary</itunes:summary>
    <description>Description</description>
    <itunes:owner>
        <itunes:name>Owner Name</itunes:name>
        <itunes:email>Owner email</itunes:email>
    </itunes:owner>
    <itunes:image image.jpg"/>
    <itunes:category text="MISC">
        <itunes:category text="MISC"/>
        </itunes:category> 
    <itunes:block>no</itunes:block>
    <itunes:explicit>no</itunes:explicit>

    <item>
        <title>First Entry</title>
        <itunes:author>Author</itunes:author>
        <itunes:subtitle>Just Another Entry</itunes:subtitle>
        <itunes:summary>Podcast Summary.</itunes:summary>
        <enclosure url="url_to_mp3" length="48412967" type="audio/mpeg"/>
        <guid>url_to_mp3</guid>
        <pubDate>Sun, 12 Oct 2014 12:00:00 -0500</pubDate>
        <itunes:duration>00:50:26</itunes:duration>
        <itunes:block>no</itunes:block>
        <itunes:explicit>no</itunes:explicit>
    </item>

我目前的代码:

from lxml import etree

tree = etree.parse(file)
root = tree.getroot()
child = root.getchildren()
child.insert(13, etree.Element('item'))
child[13].insert(0, etree.SubElement(child[13], 'title'))

感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:0)

以下是我提出的答案。

from lxml import etree
parser = etree.XMLParser(remove_blank_text=True)
tree = etree.parse('file', parser)
root = tree.getroot()
child = root.find('channel')
new_item = etree.Element('item')
new_title = etree.SubElement(new_item, 'title')
new_title.text = "Test Title"
child.insert(13, new_item)
tree.write('file', pretty_print=True, xml_declaration=True, encoding='UTF-8')