2015-11-16 2 views
0

У меня возникли проблемы с выбором определенного набора путей с использованием lxml. Структура SVG выглядит следующим образомВыберите пути SVG группы по идентификатору группы, используя lxml

<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> 
<!-- Created with matplotlib (http://matplotlib.org/) --> 
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" height="288pt" version="1.1" viewBox="0 0 432 288" width="432pt"> 
    <defs> 
     <style type="text/css"> 
      *{stroke-linecap:butt;stroke-linejoin:round;} 
     </style> 
    </defs> 
    <g id="figure_1"> 
     <g id="patch_1"> 
      <path d=" M0 288 L432 288 L432 0 L0 0 z " style="fill:#ffffff;"/> 
     </g> 
     <g id="patch_2"> 
      <path d=" M0 288 L432 288 L432 0 L0 0 z " style="fill:#ffffff;"/> 
     </g> 
    <g id="axes_1"> 
     <g id="Poly3DCollection_1"> 
      <path clip-path="url(#pe61355d493)" d=" M195.211 34.2225 L194.801 34.0894 L196.527 212.986 L196.909 212.999 z " style="fill:#0000ff;"/> 
      <path clip-path="url(#pe61355d493)" d=" M195.504 34.3231 L195.211 34.2225 L196.909 212.999 L197.184 213.022 z " style="fill:#0000ff;"/> 
... 

Ее путь, перечисленный в нижней части, что я хочу, чтобы выбрать и изменить свой стиль, но я не могу показаться, чтобы получить правильный синтаксис, и я не выбирать путь

ifilename = "myfig.svg" 
with open(ifilename, 'r') as infile: 
tree = etree.parse(infile) 

elements = tree.findall(".//g[@id='Poly3DCollection_1'") 
new_style = 'stroke-width:4px; stroke: linear-gradient(orange, darkblue)' 

for child in elements: 
    child.attrib['style'] = new_style 

mod_svg = 'myfigmod.svg' 
tree.write(mod_svg) 

EDIT

так что это заставляет меня элемент, я хочу в этом случае, но я все же хотел бы конкретный способ получения этого элемента

root = tree.getroot() 
for child in root[1][2][0]: 
    child.attrib['style'] = new_style 
+1

[Похоже, вам не хватает пространства имен SVG] (http://stackoverflow.com/a/10494517/1572077) – miah

+0

Я попытался добавить 'SVG_NS =«http://www.w3.org/2000/svg " elements = tree.findall (" .// g [@ id = 'Poly3DCollection_1'] ".format (SVG_NS))', но это не имеет никакого эффекта. – EnduroDave

+0

Вы уронили ']' в своем определении xpath – miah

ответ

1

В etree нет get_element_by_id, поэтому вам нужно использовать xpath, как вы делаете, чтобы захватить элемент. Я создал файл и выполнил код ниже и смог изменить стиль группы.

element = tree.findall(".//{%s}g[@id='Poly3DCollection_1']" % SVG_NS)[0] 
element.attrib["style"] = new_style 
+0

Спасибо, к сожалению, это не помогло. Я не думаю, что это проблема с пространством имен - см. Мое редактирование на исходное сообщение, где я могу получить элемент, используя корень и порядок списка. – EnduroDave

+0

. Этот код не работал для меня (я, вероятно, не объяснил, что мне очень понравилось), но он я получил почти весь путь к этому рабочему коду 'element = tree.findall (" .//{% s} g [@ id = 'Poly3DCollection_1'] "% SVG_NS) [0] для дочернего элемента: ребенок .attrib ['style'] = new_style' Большое спасибо – EnduroDave

Смежные вопросы