Парсер xml в python для xbmc
Я хотел бы получить вашу помощь с моим сценарием.py.
Я использую XML-файл для хранения пути парсера для изображений.
Вот XML-файл, который я использую:
<?xml version="1.0" encoding="utf-8"?>
<window type="dialog">
<allowoverlay>no</allowoverlay>
<coordinates>
<system>1</system>
<posx>0</posx>
<posy>0</posy>
</coordinates>
<controls>
<control type="image" id="1">
<posx>0</posx>
<posy>0</posy>
<width>1280</width>
<height>720</height>
<texture>background-defeat.png</texture>
<animation effect="fade" start="0" end="100" time="6500">WindowOpen</animation>
</control>
<control type="image" id="2">
<description>Image 2</description>
<posx>307</posx>
<posy>7</posy>
<width>154</width>
<height>95</height>
<visible>true</visible>
<texture>Image 2.png</texture>
<animation effect="fade" start="0" end="100" time="1500">WindowOpen</animation>
</control>
<control type="image" id="3">
<description>Image 3</description>
<posx>460</posx>
<posy>7</posy>
<width>188</width>
<height>95</height>
<visible>true</visible>
<texture>Image 3.jpg</texture>
<animation effect="fade" start="0" end="100" time="1500">WindowOpen</animation>
</control>
<control type="image" id="4">
<description>Image 4</description>
<posx>648.5</posx>
<posy>7</posy>
<width>165</width>
<height>95</height>
<visible>true</visible>
<texture>recorded_blue.jpg</texture>
<animation effect="fade" start="0" end="100" time="1500">WindowOpen</animation>
</control>
<control type="image" id="5">
<description>Image 5</description>
<posx>813.5</posx>
<posy>7</posy>
<width>149</width>
<height>95</height>
<visible>true</visible>
<texture>Image 5.jpg</texture>
<animation effect="fade" start="0" end="100" time="1500">WindowOpen</animation>
</control>
</controls>
</window>
Вот скрипт.py:
import xbmc
import xbmcgui
import os
#get actioncodes from keymap.xml
ACTION_MOVE_LEFT = 1
ACTION_MOVE_RIGHT = 2
ACTION_MOVE_UP = 3
ACTION_MOVE_DOWN = 4
ACTION_PREVIOUS_MENU = 10
ACTION_BACKSPACE = 110
class MyClass(xbmcgui.WindowXML):
def onAction(self, action):
if action == ACTION_BACKSPACE:
self.close()
if action == ACTION_PREVIOUS_MENU:
self.close()
if action == ACTION_MOVE_LEFT:
if os.path.exists('Q:\\resources\skins\Default\media\image 4.jpg') == True:
self.strAction = xbmcgui.ControlLabel(300, 200, 600, 200, '', 'font14', '0xFF00FF00')
self.addControl(self.strAction)
self.strAction.setLabel('Image is exist')
Вот парсер xml:
import xml.etree.ElementTree as ET
filename = 'script-tvguide-mainmenu.xml'
tree = ET.parse(filename)
root = tree.getroot()
controls = root.find('controls')
for control in controls.findall('control'):
#how do you create the if statement to check for the image through on xml if they are exist?
# Here are the image filenames, focus and nofocus.
focus = control.find('texturefocus').text
nofocus = control.find('texturenofocus').text
print('texturefocus={0}, texturenofocus={1}'.format(focus, nofocus))
Я пробовал с:
if action == ACTION_MOVE_LEFT:
filename = 'script-tvguide-mainmenu.xml'
tree = ET.parse(filename)
root = tree.getroot()
controls = root.find('controls')
for control in controls.findall('control'):
texture = control.find('texture').text
if texture == 'tvguide_yellow.png':
self.strAction = xbmcgui.ControlLabel(300, 200, 600, 200, '', 'font14', '0xFF00FF00')
self.addControl(self.strAction)
self.strAction.setLabel('Image is exisit')
Я хочу знать, как вы используете, чтобы написать на python для парсера xml include if, что если у меня есть изображение с именем "Image 2.jpg", которое возвращает true, тогда я могу что-то сделать?
1 ответ
Вот самый простой способ адаптировать ваш код, чтобы найти элемент управления, чей texture
является Image 2.jpg
:
Во-первых, вы ищете элемент с именем texturefocus
, Но в вашем примере XML такого элемента нет - и даже если бы он был, то тот, который вы ищете, называется texture
, Очевидно, что вам нужно это исправить:
texture = control.find('texture').text
Во-вторых, вы ищете изображение Image 2.jpg
, но в вашем XML такого изображения нет, поэтому вы не найдете его. Есть Image 2.png
, но это не одно и то же. Итак, по-видимому, вы должны это исправить.
А теперь if
Утверждение тривиально:
if texture == 'Image 2.png':
Вопрос в том, что вы хотите сделать, когда найдете это? Простая распечатка строки не поможет остальной части кода использовать это значение.
Предположим, что вы хотите написать функцию, которая возвращает description
если есть изображение, чье texture
является Image 2.png
или возвращает None
иначе. Затем:
def find_image2(filename):
tree = ET.parse(filename)
root = tree.getroot()
controls = root.find('controls')
for control in controls.findall('control'):
texture = control.find('texture')
if texture and texture.text == 'Image 2.png':
return control.find('description').text