Использование пространств имен в lxml - PullRequest
0 голосов
/ 12 мая 2018

Я пытаюсь выполнить svg-разбор с lxml и бороться с пространствами имен.

Вопросы:

  1. Как перебрать все теги image с tree.iterfind и картой namsepace? tree.iterfind('image', root.nsmap) ничего не перенастраивает, уродливее tree.iter('{http://www.w3.org/2000/svg}image') работает
  2. Я пытаюсь превратить теги image в теги use. В то время как lxml дает мне словарь атрибутов с xlinx:href, он задыхается при передаче его на makeelement, есть ли элегантное решение?
  3. Должен ли я использовать lxml или есть что-то лучшее (более прямолинейное)? Моя цель - переписать теги image в теги use и встроить содержимое ссылочных svgs в символы. (Пока что lxml и проблемы, которые у меня были с пространствами имен, кажутся отталкивающими). ​​

.

from lxml import etree

def inlineSvg(path):
    parser = etree.XMLParser(recover=True)
    tree = etree.parse(path, parser)

    root = tree.getroot()
    print(root.nsmap)


    for img in tree.iter('{http://www.w3.org/2000/svg}image'):
    #for img in tree.iterfind('image', root.nsmap): #for some reason I can't get this to work...
        print(img)

        #we have to translate xlink: to {http://www.w3.org/1999/xlink} for it to work, despit the lib returning xlink: ...
        settableAttributes = dict(img.items()) #img.attribute
        settableAttributes['{http://www.w3.org/1999/xlink}href'] = settableAttributes['xlink:href']
        del settableAttributes['xlink:href']

        print(etree.tostring(img.makeelement('use', settableAttributes)))

1 Ответ

0 голосов
/ 12 мая 2018
  • Как перебрать все теги изображений с tree.iterfind и картой namsepace?
for img in root.iterfind('image', namespaces=root.nsmap):
  • Я пытаюсь превратить теги изображений в теги использования.В то время как lxml дает мне словарь атрибутов с xlinx: href, он задыхается при передаче его в makeelement. Есть ли элегантное решение?

Любая из этих работ для меня:

img.makeelement('use', dict(img.items())
img.makeelement('use', img.attrib)
  • Должен ли я использовать lxml или есть что-то лучшее (более прямолинейное)?

У всех есть свое мнение.Мне нравится lxml.Я нахожу это очень простым.Ваше мнение может отличаться.


Полная программа:

from lxml import etree

def inlineSvg(path):
    parser = etree.XMLParser(recover=True)
    tree = etree.parse(path, parser)

    root = tree.getroot()

    for img in root.iterfind('image', namespaces=root.nsmap):
        use = img.makeelement('use', img.attrib, nsmap=root.nsmap)
        print(etree.tostring(use))

inlineSvg('xx.svg')

Входной файл (xx.svg):

<svg xmlns="http://www.w3.org/2000/svg"
    xmlns:xlink="http://www.w3.org/1999/xlink">

  <rect x="10" y="10" height="130" width="500" style="fill: #000000"/>

  <image x="20" y="20" width="300" height="80"
     xlink:href="http://jenkov.com/images/layout/top-bar-logo.png" />

  <line x1="25" y1="80" x2="350" y2="80"
            style="stroke: #ffffff; stroke-width: 3;"/>
</svg>

Результат:

$ python xx.py 
b'<use xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" height="80" width="300" x="20" y="20" xlink:href="http://jenkov.com/images/layout/top-bar-logo.png"/>'

Ссылка:

...