2014-01-28 25 views
1

在堆棧溢出的幫助下,我設法使用一些python代碼來處理xml文件(使用lxml)。我已經能夠適應很多不同的目的,但有一件事我無法解決。如何使用python和lxml檢索某些子元素

例XML:

<?xml version="1.0" encoding="UTF-8" ?> 
    <TVAMain xml:lang="PL" publisher="Someone" publicationTime="2014-01-03T06:24:24+00:00" version="217" xmlns="urn:tva:metadata:2010" xmlns:mpeg7="urn:tva:mpeg7:2008"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:tva:metadata:2010 http://Something.xsd"> 
    <ProgramDescription> 
     <ProgramInformationTable> 
     <ProgramInformation programId="crid://bds.tv/88032"><BasicDescription> 
      <Title xml:lang="PL" type="episodeTitle">Some Title</Title> 
      <Synopsis xml:lang="PL" length="short">Some Synopsis</Synopsis> 
       <Genre href="urn:tva:metadata:cs:EventGenreCS:2009:96"> 
       <Name xml:lang="EN">Some Genre</Name> 
       </Genre> 
       <Language>PL</Language> 
       <RelatedMaterial> 
       <HowRelated href="urn:eventis:metadata:cs:HowRelatedCS:2010:boxCover"> 
       <Name>Box cover</Name> 
       </HowRelated> 
       <MediaLocator> 
       <mpeg7:MediaUri>file://Images/98528834.p.jpg</mpeg7:MediaUri> 
       </MediaLocator> 
      </RelatedMaterial> 

的Python代碼將返回標題,流派和概要,但它不會返回到圖像參考(從底部第三線)。我認爲這是因爲名稱格式'mpeg7:MediaUri'(我無法改變)。代碼將返回'No Image'字符串。

這是relavent Python代碼

file_name = input('Enter the file name, including .xml extension: ') 
print('Parsing ' + file_name) 

from lxml import etree 

parser = etree.XMLParser() 

tree = etree.parse(file_name, parser) 
root = tree.getroot() 

nsmap = {'xmlns': 'urn:tva:metadata:2010'} 

with open(file_name+'.log', 'w', encoding='utf-8') as f: 

    for info in root.xpath('//xmlns:ProgramInformation', namespaces=nsmap): 

    crid = (info.get('programId')) 

    titlex = (info.find('.//xmlns:Title', namespaces=nsmap))   
    title = (titlex.text if titlex != None else 'No title') 

    genrex = (info.find('.//xmlns:Genre/xmlns:Name', namespaces=nsmap)) 
    genre = (genrex.text if genrex != None else 'No Genre') 

    imagex = (info.find('.//xmlns:RelatedMaterial/xmlns:MediaLocator/xmlns:"mpeg7:MediaUri"', namespaces=nsmap)) 
    image = (image.text if imagex != None else 'No Image') 

    f.write('{}|{}|{}|{}\n'.format(crid, title, genre, image)) 

有人能解釋我如何能適應「ImageX的」線,使其返回「文件://Images/98528834.p.jpg」從示例?我看了一下使用方括號,但它導致了一個錯誤。

回答

1

您感興趣的節點有mpeg7命名空間,而不是默認命名空間。你可以用這種語法*[local-name() = "elementName"]嘗試匹配元素通過它的本地名(忽略的命名空間):

imagex = info.xpath(
    './/xmlns:RelatedMaterial/xmlns:MediaLocator/*[local-name() = "MediaUri"]', 
    namespaces=nsmap)[0] 

或在命名空間聲明中加入mpeg7

nsmap = {'xmlns': 'urn:tva:metadata:2010', 'mpeg7':'urn:tva:mpeg7:2008'} 

那麼您可以在XPath的使用mpeg7前綴查詢:

imagex = (info.find('.//xmlns:RelatedMaterial/xmlns:MediaLocator/mpeg7:MediaUri', namespaces=nsmap)) 
+0

感謝您的回覆。給它一個嘗試,但得到'SyntaxError:invalid predicate'的錯誤。 任何想法? (沒有足夠的空間來放置整個錯誤)。 – Nick

+0

在「MediaUri」之後已經添加了缺失' – Nick

+0

我不認爲如果涉及python特定的錯誤,只知道xpath和xml,我可以提供很多幫助。因此,從我的答案中的3個代碼段中,您試過哪條線並給出了錯誤? – har07

相關問題