python - 在递归嵌套的 XML 中获得最高级别的元素嵌入
问题描述
对于任意递归嵌套的 XML 中的每个元素,我需要找到它的最大嵌入级别。
例如对于这个 XML
<chorus>
<l>Alright now lose it <ah>aah <i>aah <ah>a<ah>a</ah>h</ah> aah</i> aah</ah></l>
<l>Just lose it aah aah aah aah aah</l>
<l>Go crazy aah aah aah aah aah</l>
<l>Oh baby <ah>aah aah</ah>, oh baby baby <ah>aah aah</ah></l>
</chorus>
输出应如下所示:{"chorus": 0, "l": 0, "ah": 2, "i": 0}
不幸的是,该解决方案仅限于使用xml.etree.ElementTree
.
我尝试了几个小时不同的方法,但我无法理解它。
解决方案
您可以使用文档中此示例的修改版本:
尝试使用元素名称(标签)作为键更改maxDepth
和字典...depth
Python
from xml.etree.ElementTree import XMLParser
class MaxDepth: # The target object of the parser
maxDepth = {}
depth = {}
def start(self, tag, attrib): # Called for each opening tag.
try:
self.depth[tag] += 1
except KeyError:
self.depth[tag] = 0
self.maxDepth[tag] = 0
if self.depth[tag] > self.maxDepth[tag]:
self.maxDepth[tag] = self.depth[tag]
def end(self, tag): # Called for each closing tag.
self.depth[tag] -= 1
def data(self, data):
pass # We do not need to do anything with data.
def close(self): # Called when all data has been parsed.
return self.maxDepth
target = MaxDepth()
parser = XMLParser(target=target)
exampleXml = """
<chorus>
<l>Alright now lose it <ah>aah <i>aah <ah>a<ah>a</ah>h</ah> aah</i> aah</ah></l>
<l>Just lose it aah aah aah aah aah</l>
<l>Go crazy aah aah aah aah aah</l>
<l>Oh baby <ah>aah aah</ah>, oh baby baby <ah>aah aah</ah></l>
</chorus>"""
parser.feed(exampleXml)
print(parser.close())
输出
{'chorus': 0, 'l': 0, 'ah': 2, 'i': 0}
已编辑的 Python(其中chorus
已经是一个ElementTree.Element
对象)
import xml.etree.ElementTree as ET
from xml.etree.ElementTree import XMLParser
class MaxDepth: # The target object of the parser
maxDepth = {}
depth = {}
def start(self, tag, attrib): # Called for each opening tag.
try:
self.depth[tag] += 1
except KeyError:
self.depth[tag] = 0
self.maxDepth[tag] = 0
if self.depth[tag] > self.maxDepth[tag]:
self.maxDepth[tag] = self.depth[tag]
def end(self, tag): # Called for each closing tag.
self.depth[tag] -= 1
def data(self, data):
pass # We do not need to do anything with data.
def close(self): # Called when all data has been parsed.
return self.maxDepth
exampleXml = """
<chorus>
<l>Alright now lose it <ah>aah <i>aah <ah>a<ah>a</ah>h</ah> aah</i> aah</ah></l>
<l>Just lose it aah aah aah aah aah</l>
<l>Go crazy aah aah aah aah aah</l>
<l>Oh baby <ah>aah aah</ah>, oh baby baby <ah>aah aah</ah></l>
</chorus>"""
chorus_element = ET.fromstring(exampleXml)
target = MaxDepth()
parser = XMLParser(target=target)
parser.feed(ET.tostring(chorus_element))
print(parser.close())
推荐阅读
- amazon-web-services - Amazon Forecast 的 create_dataset_import_job S3 角色需要星号访问 S3 资源
- c++ - HDF5 错误:无法锁定文件,资源暂时不可用
- javascript - Javascript - 不能在模块外使用 import 语句
- accessibility - 关闭模式视图后如何将焦点设置在以前的辅助功能元素上
- git - 如何将 SSH 私钥添加到 Intellij for Git
- java - Intellij 不允许我在项目目录中运行项目
- php - 无法从 woocommerce 中使用产品属性过滤的订单中获取变体属性
- laravel - 为什么我的下载功能(使用 Vue JS 和 Laravel 创建)会导致文件损坏?
- angular - 带有角度/离子的云函数firebase调用无法获得结果,但可以使用curl
- liquid-xml - LxSerializer 的 UnknownAttribute 事件