如何使用python从xmlfi获取值

2024-06-02 08:27:21 发布

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

我需要帮助。我有这个XML:

<?xml version="1.0"?>
<WDAT>
<EMOD>
      <MATERIAL number="1.2345">
            <Values>
                      <X>20.0</X>
                      <Y>200.0</Y>
            </Values>
            <Values>
                      <X>100.0</X>
                      <Y>190.0</Y>
            </Values>
            <Values>
                      <X>200.0</X>
                      <Y>185.0</Y>
            </Values>
            <Values>
                      <X>300.0</X>
                      <Y>180.0</Y>
            </Values>
            <Values>
                      <X>400.0</X>
                      <Y>175.0</Y>
            </Values>
    </MATERIAL>
</EMOD>
</WDAT>

例如,我想得到一个数组,其中包含材质编号1.2345的X-Y值。在

^{pr2}$

变量“material”有正确的内存地址,但是我很难从X和Y中获取值

谢谢。在

拉斐尔


Tags: numberversion数组xml编号materialvalues材质
3条回答
material = tree_materials.xpath("//MATERIAL[@number='1.2345']")[0]
x_values = [x.text for x in material.xpath("//X")]
y_values = [y.text for y in material.xpath("//Y")]
xy_values = zip(x_values, y_values)

在“MATERIAL”下面有两个级别,所以需要将这两个级别都传递给findall。你可以:

material = tree_materials.find(".//MATERIAL[@number='1.2345']")
lx = material.findall('Values/X')
ly = material.findall('Values/Y')
points = zip([x.text for x in lx], [y.text for y in ly])

但是,如果有人意外地给了您这样一个文件,您必须信任您的XML来完成此操作:

^{pr2}$

然后你会得到(200.0, 185.0), (180.0, 175.0),由于zip在最短的条目处停止,所以400.0将被悄悄地丢弃,你甚至可能不知道。 显式更好:

values = material.findall('Values')
points = [(v.find('X').text, v.find('Y').text) for v in values]

如果X或Y节点不存在,这将抛出一个异常,您将立即看到它。在

您将需要执行另一个列表理解来将这些转换为float,但您已经可以这样做了。在

在最后2行中,您可以执行以下操作:

    material = tree_materials.find(".//MATERIAL[@number='1.2345']")
    xs = material.findall('X')
    ys = material.findall('Y')
    values = zip([x.text for x in xs], [x.text for x in xs])

这将输出元组列表,如[(“20.0”,“200.0”)…]

相关问题 更多 >