首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >lxml iterparse,具有相同标记名称的子级

lxml iterparse,具有相同标记名称的子级
EN

Stack Overflow用户
提问于 2015-10-12 22:28:07
回答 2查看 1.4K关注 0票数 2

我想从文件(1,5 to文件)中动态解析xml,如下所示:

代码语言:javascript
复制
<product product_id="x" name="x" sku_number="x">
    <category>
        <primary>x</primary>
        <secondary>y</secondary>
    </category>
    <URL>
        <product>URL__I_WANT_TO_PULLOUT</product>
        <productImage>x</productImage>
    </URL>
    <description>
        <short>x</short>
        <long>x</long>
    </description>
</product>

我使用lxml.etree.iterparse的方式如下:

代码语言:javascript
复制
for event, elem in ET.iterparse(f, events=('end',), tag='product'):
    save_product(elem)

我从xml节点获取所有必需的值。我唯一不能取出的节点是URL>product (它是空的)。我认为这是由相同的标签名称引起的。除了iterparse之外,还有什么方法可以动态解析xml吗?

EN

回答 2

Stack Overflow用户

发布于 2015-10-13 05:09:55

如果我在您的示例上运行etree.iterparse,它会找到两次'product'标记:有一个外部<product>和一个内部and。外部标记具有子元素,并且其text为空。因此,您需要跳过这些外部'product'标记,以便只处理那些没有子元素的标记,例如:

代码语言:javascript
复制
for event, elem in etree.iterparse(f, events=('end',), tag='product'):
    if not len(elem):
        save_product(elem)

如果需要处理顶级product标记的所有元素,则可以删除主循环中的所有内部product字段,然后按路径处理所有子元素,例如python's lxml and iterparse method

代码语言:javascript
复制
def save_product(elem):
    cat_prim = elem.xpath('category/primary')[0].text;
    cat_sec = elem.xpath('category/secondary')[0].text;
    url_prod = elem.xpath('URL/product')[0].text;
    url_img = elem.xpath('URL/productImage')[0].text;
    desc_short = elem.xpath('description/short')[0].text;
    desc_long = elem.xpath('description/long')[0].text;

for event, elem in etree.iterparse(f, events=('end',), tag='product'):
    if len(elem):
        save_product(elem)
票数 2
EN

Stack Overflow用户

发布于 2019-12-11 21:56:15

我知道现在可能已经很晚了,但对于任何人来说,我都使用了以下解决方案:

代码语言:javascript
复制
   file_contents = xml_file.read()
   xml_obj = etree.fromstring(file_contents)
   context = xml_obj.xpath(tag)

我的tag变量是产品的路径,例如//parent/product。然后,您可以使用上下文容器对元素执行某些操作。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33083667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档