我想从文件(1,5 to文件)中动态解析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的方式如下:
for event, elem in ET.iterparse(f, events=('end',), tag='product'):
save_product(elem)我从xml节点获取所有必需的值。我唯一不能取出的节点是URL>product (它是空的)。我认为这是由相同的标签名称引起的。除了iterparse之外,还有什么方法可以动态解析xml吗?
发布于 2015-10-13 05:09:55
如果我在您的示例上运行etree.iterparse,它会找到两次'product'标记:有一个外部<product>和一个内部and。外部标记具有子元素,并且其text为空。因此,您需要跳过这些外部'product'标记,以便只处理那些没有子元素的标记,例如:
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
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)发布于 2019-12-11 21:56:15
我知道现在可能已经很晚了,但对于任何人来说,我都使用了以下解决方案:
file_contents = xml_file.read()
xml_obj = etree.fromstring(file_contents)
context = xml_obj.xpath(tag)我的tag变量是产品的路径,例如//parent/product。然后,您可以使用上下文容器对元素执行某些操作。
https://stackoverflow.com/questions/33083667
复制相似问题