给定的XML文件片段为:

<?xml version="1.0" standalone="yes"?>
<event_configuration family="21" version="2">
    <pqr subtype="abc">
    <event val="73002" name="$MyCpu"> </event>
    <event val="73003" name="$MyCpuKernel"> </event>

    <metric name="Ratio" expression="$MyCpuKernel / $MyCpu"> </metric>
    </pqr>
</event_configuration>

我已经用Python语言中的"ElementTree"库解析了这个XML文件,请查看以下代码:

    def parse_xml_to_json(self):
        data = {'metric': []}
        root = ET.fromstring(self.xml_file)

        for element in root.findall('.//*'):
            element_type = element.tag
            if element_type not in ["pqr", "stu", "vwx"]:
                continue
            subtype_name = element.attrib['subtype']
            event_map = {}
            for event in element.findall('.//event'):
                event_name = event.attrib['name']
                val_value = event.attrib['val']
                event_map[event_name] = val_value

            for metric in element.findall('metric'):
                expression = metric.attrib['expression']
                metric_name = metric.attrib['name']
          
                for event_name, val_value in event_map.items():
                    expression = expression.replace(event_name, val_value)

                data['metric'].append({
                    'Name': metric_name,
                    'Expression': expression,
                    'Type': element_type
                })

        return data

我正在获取输出,但此代码无法将"Expression"中的事件名称替换为val_value,如下所示:

输出:

{
"metric": [
    {
        "Name": "Ratio",
        "Expression": "73002Kernel / 73002",
        "Type": "pqr"
    },
    ....
    ....
]
}
    

在这里,我们可以在"表达式"中看到它应该打印为"73003/73002". 我想不出如何解决这个问题.这里可以使用正则表达式吗?如何应用?请提个建议.

推荐答案

以下是如何使用re.sub替换表达式中的值的示例:

import re
import xml.etree.ElementTree as ET


def parse_xml_to_json(xml_file):
    data = {"metric": []}
    root = ET.fromstring(xml_file)

    for element in root.findall(".//*"):
        element_type = element.tag
        if element_type not in ["pqr", "stu", "vwx"]:
            continue
        subtype_name = element.attrib["subtype"]
        event_map = {}
        for event in element.findall(".//event"):
            event_name = event.attrib["name"]
            val_value = event.attrib["val"]
            event_map[event_name] = val_value

        for metric in element.findall("metric"):
            expression = metric.attrib["expression"]
            metric_name = metric.attrib["name"]

            for event_name, val_value in event_map.items():
                expression = re.sub(
                    rf"{re.escape(event_name)}\b", val_value, expression
                )

            data["metric"].append(
                {"Name": metric_name, "Expression": expression, "Type": element_type}
            )

    return data


xml_file = """\
<?xml version="1.0" standalone="yes"?>
<event_configuration family="21" version="2">
    <pqr subtype="abc">
    <event val="73002" name="$MyCpu"> </event>
    <event val="73003" name="$MyCpuKernel"> </event>

    <metric name="Ratio" expression="$MyCpuKernel / $MyCpu"> </metric>
    </pqr>
</event_configuration>"""

print(parse_xml_to_json(xml_file))

打印:

{'metric': [{'Name': 'Ratio', 'Expression': '73003 / 73002', 'Type': 'pqr'}]}

Python相关问答推荐

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

更改matplotlib彩色条的字体并勾选标签?

如何在具有重复数据的pandas中对groupby进行总和,同时保留其他列

Matlab中是否有Python的f-字符串等效物

在Wayland上使用setCellWidget时,try 编辑QTable Widget中的单元格时,PyQt 6崩溃

为什么NumPy的向量化计算在将向量存储为类属性时较慢?'

Django—cte给出:QuerySet对象没有属性with_cte''''

手动设置seborn/matplotlib散点图连续变量图例中显示的值

OpenCV轮廓.很难找到给定图像的所需轮廓

Python日志(log)模块如何在将消息发送到父日志(log)记录器之前向消息添加类实例变量

不允许 Select 北极滚动?

使用tqdm的进度条

Js的查询结果可以在PC Chrome上显示,但不能在Android Chrome、OPERA和EDGE上显示,而两者都可以在Firefox上运行

如何从比较函数生成ngroup?

设置索引值每隔17行左右更改的索引

如何将列表从a迭代到z-以抓取数据并将其转换为DataFrame?

如何在Quarto中的标题页之前创建序言页

在Pandas 中以十六进制显示/打印列?

大Pandas 中的群体交叉融合

在Django REST框架中定义的URL获得404分