2

助けが必要です。私はこの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 の XY 値を含む配列を取得したいと考えています。

tree_materials = ET.parse(r"materials.xml")
root_materials = tree_materials.getroot()
materials = root_materials.findall('EMOD/MATERIAL')
material = tree_materials.findall(".//MATERIAL[@number='1.2345']")
valuess = material.findall('X')

変数「マテリアル」には正しいメモリ アドレスがありますが、X と Y から値を取得するのが困難です。

ありがとう。

ラファエル

4

3 に答える 3

1

「MATERIAL」の下には 2 つのレベルがあるため、両方のレベルを 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 を本当に信頼する必要があります。誰かが誤って次のようなファイルを渡した場合:

        <Values>
                  <X>200.0</X>
                  <Y>185.0</Y>
        </Values>
        <Values>
                  <Y>180.0</Y>
        </Values>
        <Values>
                  <X>400.0</X>
                  <Y>175.0</Y>
        </Values>

そして(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 にキャストするには、別のリスト内包表記を行う必要がありますが、既にそれを行うことができます。

于 2013-10-16T13:13:54.923 に答える
0
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)
于 2013-10-16T13:38:50.720 に答える