我在使用 nsmap for lxml 库添加标签时遇到问题



>我写了一个函数来生成带有lxml库的Google Merchant RSS Feed

。我有以下代码,它被缩短为单个标签:


from lxml import etree
def generate_xml(self):
nsmap = {
"g": "http://base.google.com/ns/1.0",
}
page = etree.Element('rss', nsmap=nsmap)
channel = etree.SubElement(page, 'channel')
channel_title = etree.SubElement(channel, 'title')
channel_title.text = "Test RSS 2.0 data feed template products"
channel_description = etree.SubElement(channel, 'description')
channel_description.text = "test data feed template."
channel_link = etree.SubElement(channel, 'link')
channel_link.text = "https://test-abcd.com"
item = etree.SubElement(channel, "item")
item_id = etree.SubElement(item, "id", nsmap=nsmap)
item_id.text = "123456789"
return etree.tostring(page, xml_declaration=True, encoding="utf-8")

该函数返回以下输出:


<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Test RSS 2.0 data feed template products</title>
<description>test data feed template.</description>
<link>https://test-abcd.com</link>
<item>
<id>123456789</id>
</item>
</channel>
</rss>

但它应该如下(<g:id>123456789</g:id>(:


<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:g="http://base.google.com/ns/1.0">
<channel>
<title>Test RSS 2.0 data feed template products</title>
<description>test data feed template.</description>
<link>https://test-abcd.com</link>
<item>
<g:id>123456789</g:id>
</item>
</channel>
</rss>

我找到了使用etree.QName()id构建限定名称的解决方案:

def generate_xml(self):
nsmap = {
"g": "http://base.google.com/ns/1.0",
}
page = etree.Element('rss', nsmap=nsmap)
channel = etree.SubElement(page, 'channel')
channel_title = etree.SubElement(channel, 'title')
channel_title.text = "Test RSS 2.0 data feed template products"
channel_description = etree.SubElement(channel, 'description')
channel_description.text = "test data feed template."
channel_link = etree.SubElement(channel, 'link')
channel_link.text = "https://test-abcd.com"
item = etree.SubElement(channel, "item")
item_id = etree.SubElement(item, etree.QName(nsmap.get("g"), 'id'))
item_id.text = "123456789"
return etree.tostring(page, xml_declaration=True, encoding="utf-8")

最新更新