Python уменьшать числа в файле XML - PullRequest
0 голосов
/ 27 июня 2019

У меня есть XML-файл с координатами точки, подобной этой

<vertex x="15" y="15.2"/>

Я хотел бы масштабировать эти координаты, как

<vertex x="15*factor" y="15.2*factor"/>

с factor=0.2 (число)

Я думал об использовании re.Примерно так:

 re.sub(r'(x=\"[0-9]\"', X, X*factor, data)

Я предпочитаю не два цикла по всем строкам, а split и так один ...

, так как я читаю файл как одну строку

f = open(filename)
data = f.read()
f.close()

РЕДАКТИРОВАНИЕ:

Больше контекста

<polygon>
    <vertex x="-15" y="15"/>
    <vertex x="-15" y="-15"/>
</polygon>
<polygon>
    <vertex x="15" y="-15"/>
    <vertex x="15" y="15"/>
</polygon>
<polygon>
    <vertex x="-15" y="-15"/>
    <vertex x="15" y="-15"/>
</polygon>

Вывод для фактора = 0,1

<polygon>
    <vertex x="-1.5" y="1.5"/>
    <vertex x="-1.5" y="-1.5"/>
</polygon>
<polygon>
    <vertex x="1.5" y="-1.5"/>
    <vertex x="1.5" y="1.5"/>
</polygon>
<polygon>
    <vertex x="-1.5" y="-1.5"/>
    <vertex x="1.5" y="-1.5"/>
</polygon>

Есть идеи?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Здесь

import xml.etree.ElementTree as ET


xml = '''<r><polygon>
    <vertex x="-15" y="15"/>
    <vertex x="-15" y="-15"/>
</polygon>
<polygon>
    <vertex x="15" y="-15"/>
    <vertex x="15" y="15"/>
</polygon>
<polygon>
    <vertex x="-15" y="-15"/>
    <vertex x="15" y="-15"/>
</polygon></r>'''


def scale(factor):
    root = ET.fromstring(xml)
    vertex_lst = root.findall('.//vertex')
    for vertex in vertex_lst:
        for attr in ['x','y']:
            vertex.attrib[attr] = str(int(vertex.attrib[attr]) * factor)
    ET.dump(root)


scale(0.1)

выход

<r><polygon>
    <vertex x="-1.5" y="1.5" />
    <vertex x="-1.5" y="-1.5" />
</polygon>
<polygon>
    <vertex x="1.5" y="-1.5" />
    <vertex x="1.5" y="1.5" />
</polygon>
<polygon>
    <vertex x="-1.5" y="-1.5" />
    <vertex x="1.5" y="-1.5" />
</polygon></r>
0 голосов
/ 27 июня 2019

Я не совсем уверен, что здесь может быть желаемым выводом, я думаю, возможно, мы бы начали с выражения, похожего на:

(x=|y=)\"\s*([-]?[0-9]+)\s*\"

Test

import re

regex = r"(x=|y=)\"\s*([-]?[0-9]+)\s*\""

test_str = ("<polygon>\n"
    "    <vertex x=\"-15\" y=\"15\"/>\n"
    "    <vertex x=\"-15\" y=\"-15\"/>\n"
    "</polygon>\n"
    "<polygon>\n"
    "    <vertex x=\"15\" y=\"-15\"/>\n"
    "    <vertex x=\"15\" y=\"15\"/>\n"
    "</polygon>\n"
    "<polygon>\n"
    "    <vertex x=\"-15\" y=\"-15\"/>\n"
    "    <vertex x=\"15\" y=\"-15\"/>\n"
    "</polygon>")

subst = "\\1\"\\2\\*factor\""

result = re.sub(regex, subst, test_str, 0, re.MULTILINE)

if result:
    print (result)

В этой демоверсии объяснено выражение, если вам может быть интересно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...