Python elementTree получить атрибут, который заканчивается - PullRequest
0 голосов
/ 16 января 2019

давая следующий xml в качестве входных данных для elementTree (используя python 2.7):

 <body>
<div region="imageRegion" xml:id="img_SUB6756004155_0" ttm:role="caption" smpte:backgroundImage="#SUB6756004155_0">
</body>

я получаю следующие атрибуты: enter image description here

поэтому мне нужно найти атрибут, заканчивающийся на 'backgroundImage' или 'id'

обычно я бы сделал это так:

 div.get('region')

но здесь я знаю только часть имени атрибута,

можно ли использовать регулярные выражения?

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Другой вариант - перебирать атрибуты и возвращать значение атрибута с локальным именем, оканчивающимся на backgroundImage.

Пример ...

from xml.etree import ElementTree as ET

XML = '''
<body xmlns:ttm="http://www.w3.org/ns/ttml#metadata" 
      xmlns:smpte="http://smpte-ra.org/schemas/2052-1/2013/smpte-tt">
  <div region="imageRegion" xml:id="img_SUB6756004155_0" 
       ttm:role="caption" smpte:backgroundImage="#SUB6756004155_0"></div>
</body>'''

root = ET.fromstring(XML)
div = root.find("div")
val = next((v for k, v in div.attrib.items() if k.endswith('backgroundImage')), None)

if val:
    print(f"Value: {val}")

Выходы ...

Value: #SUB6756004155_0

Это может быть хрупким, хотя. Возвращает только первый найденный атрибут.

Если это проблема, используйте вместо этого список:

val = [v for k, v in div.attrib.items() if k.endswith('backgroundImage')]

Было бы также неправильно возвращать атрибут, который заканчивается на "backgroundImage" (например, "invalid_backgroundImage").

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

val = next((v for k, v in div.attrib.items() if re.match(r".*}backgroundImage$", "}" + k)), None)

Если вам когда-нибудь удастся переключиться на lxml, тестирование локального имени можно выполнить в xpath ...

val = div.xpath("@*[local-name()='backgroundImage']")
0 голосов
/ 20 января 2019

у меня тоже сработало это решение:

r = re.compile(r'img_.+')
image_id = filter(r.match, div.attrib.values())
id = image_id[0].split('_', 1)[1]

id = 'SUB6756004155_0'

0 голосов
/ 17 января 2019

Фрагмент ниже демонстрирует, как можно получить значение атрибута smpte:backgroundImage из правильно сформированного XML-документа (входной документ в вопросе не является правильно сформированным).

smpte: означает, что атрибут связан с пространством имен, которое http://smpte-ra.org/schemas/2052-1/2013/smpte-tt, судя по скриншоту. Обратите внимание, что оба префикса ttm и smpte должны быть объявлены в документе XML (xmlns:ttm="..." и xmlns:smpte="...").

В вызове get() имя атрибута должно быть дано в «Запись Кларка» : {http://smpte-ra.org/schemas/2052-1/2013/smpte-tt}backgroundImage.

from xml.etree import ElementTree as ET

XML = '''
<body xmlns:ttm="http://www.w3.org/ns/ttml#metadata" 
      xmlns:smpte="http://smpte-ra.org/schemas/2052-1/2013/smpte-tt">
  <div region="imageRegion" xml:id="img_SUB6756004155_0" 
       ttm:role="caption" smpte:backgroundImage="#SUB6756004155_0"></div>
</body>'''

root = ET.fromstring(XML)
div = root.find("div")
print(div.get("{http://smpte-ra.org/schemas/2052-1/2013/smpte-tt}backgroundImage"))

Выход:

#SUB6756004155_0
...