【问题标题】:Parsing xml with lxml only certain depth仅用 lxml 解析 xml 一定深度
【发布时间】:2021-01-29 06:55:28
【问题描述】:

我正在处理的文档只包含一定深度的有效 xml,一旦达到该深度,可能会有无效的 xml,但是可以确定在无效文本中不会出现之前的 xml 标记。 (我猜可以假设里面有二进制文件)

因此,我只需要将文档解析到一定深度,其余部分应作为文本处理,即使它可能包含其他标签。

用 lxml 可以吗,写我自己的词法分析器肯定是矫枉过正

【问题讨论】:

  • 您可以编辑您的问题并添加一个简短的 xml 示例以及您的预期输出吗?

标签: python-3.x lxml


【解决方案1】:

我正在研究一个类似的问题,与xsData 一起使用,将反序列化限制为我感兴趣的元素。双端队列示例来自LXML api。我已经添加了深度,并使用复制的父级进行重建。

from lxml import etree
from lxml.etree import Element
from collections import deque

def copyme(el):
    n = Element(el.tag, el.attrib)
    n.text = el.text
    n.tail = el.tail
    return n

def depthcopy(root, max_depth=1):
    queue = deque([(root, None, 0)])
    keep = None

    while queue:
      el, parent, depth = queue.popleft()
      if depth == max_depth:
        break

      new_parent = copyme(el)
      if parent is None:
        keep = new_parent
      else:
        parent.append(new_parent)

      # print(etree.tostring(keep))

      queue.extend([(x, new_parent, depth + 1) for x in el])
      # print(el.tag, depth)

    return keep

root = etree.XML('<root><a><b/><c/></a><d><e/></d></root>')
print(etree.tostring(depthcopy(root, 2)))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多