lxml iterparse,有相同标记的孩子nam

2024-09-25 16:29:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我想从文件(1,5gb文件)动态解析xml,它看起来像:

<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类似于:

^{pr2}$

我从xml节点获取所有必需的值。我唯一不能拉出的节点是URL>product(它只是空的)。我认为是同一个标签名造成的。除了iterparse,还有什么方法可以动态解析xml吗?在


Tags: 文件idurl节点动态descriptionxmlproduct
2条回答

如果我对您的示例运行etree.iterparse,它会发现两次'product'标记:有一个外部的,一个内部的<product>。external标记有子元素,其text为空。因此,您需要跳过那些外部的'product'标记,以便只处理那些没有子元素的标记,例如:

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

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

^{pr2}$

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

   file_contents = xml_file.read()
   xml_obj = etree.fromstring(file_contents)
   context = xml_obj.xpath(tag)

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

相关问题 更多 >