2015-07-24 5 views
1

Я пытаюсь извлечь строку /RDF/Description/id/text(), которая должна быть someid ниже. Каков подходящий xpath, чтобы извлечь это, используя lxml python?lxml xpath RDF не работает

<?xml version="1.0" encoding="utf-8"?> 
    <!-- This Source Code Form is subject to the terms of the Mozilla Public 
     - License, v. 2.0. If a copy of the MPL was not distributed with this 
     - file, You can obtain one at http://mozilla.org/MPL/2.0/. --> 
    <RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:em="http://www.mozilla.org/2004/em-rdf#"> 
     <Description about="urn:mozilla:install-manifest"> 
     <em:id>[email protected]</em:id> 
     <em:version>initial</em:version> 
     <em:type>2</em:type> 
     <em:bootstrap>true</em:bootstrap> 
     <em:unpack>false</em:unpack> 

     <!-- Firefox --> 
     <em:targetApplication> 
      <Description> 
       <em:id>{someid}</em:id> 
       <em:minVersion>7.0</em:minVersion> 
       <em:maxVersion>27.0</em:maxVersion> 
      </Description> 
     </em:targetApplication> 

     <!-- Front End MetaData --> 
     <!-- must provide default non-localized because It's used as a default on AMO. It's used as a default by the add-on manager, with the possibility of other locales overriding it. Failure to provide a non-localized name will lead to failed upload on AMO. --> 
     <em:name>l10n</em:name> 
     <em:description>ff-addon-demo: Shows how to localize restartless add-ons.</em:description> 
     <em:creator>Noitidart</em:creator> 
     <!-- start localizing --> 
     <em:localized> 
      <Description> 
       <em:locale>en-GB</em:locale> 
       <em:name>l10n :: en-GB</em:name> 
       <em:description>en-GB :: ff-addon-demo: Shows how to localize restartless add-ons. </em:description> 
       <em:creator>en-GB :: Noitidart</em:creator> 
      </Description> 
     </em:localized> 
     <em:localized> 
      <Description> 
       <em:locale>en-US</em:locale> 
       <em:name>l10n :: en-US</em:name> 
       <em:description>en-US :: ff-addon-demo: Shows how to localize restartless add-ons. </em:description> 
       <em:creator>en-US :: Noitidart</em:creator> 
      </Description> 
     </em:localized> 
     </Description> 
    </RDF> 

Я на самом деле пытался все это: "*/*[4]" , "*/*[4]" , "*/*" , "@my:*" , "em:*" , "my:*" , "@*" , "//id" , "//em:id" , "//em" , "//*[text()='USA']" , "{http://www.mozilla.org/2004/em-rdf#}:localized" , "*/*" , "//tag:RDF" , "//*RDF" , "/RDF/Description/em:targetApplication" , "*/localized" , "*/*localized" , "*/*" , "*/*" , "*/*" , "*/*" , "*/*" , "*/*" , "*/http://www.mozilla.org/2004/em-rdf#" , "*/RDF" , "*/*" , "/RDF" , "//RDF" , "/RDF", ".//Description" , "//?xml" , "//about" , "//em" , "//Description" , "/RDF" , "*/*" , "*/Description" , "*/Descriptoin" , "*" , "./?xml" , "?xml" , "//?xml" , "//http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF" , "http://www.w3.org/1999/02/22-rdf-syntax-ns#}RDF" , "//version" , "//xml" , "//" , "//RDF" , "./version" , "version" , "xml" , "/RDF/Description/*" , "/RDF/Description", тратить много времени бесплодно.

Edit: После того, как ниже решения, я нашел хороший справочный документ для этого общего вопроса https://msdn.microsoft.com/en-us/library/ms950779.aspx

ответ

0

Это один из возможных способов; увидеть, как XPath соответствует структуре XML, и как ссылаться на XML-элемент в пространстве имен с использованием XPath:

from lxml import etree 

xml = """your xml as posted in question here""" 
root = etree.fromstring(xml) 
nsmap = {'d': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#', 
     'em': 'http://www.mozilla.org/2004/em-rdf#'} 
result = root.xpath("/d:RDF/d:Description/em:targetApplication/d:Description/em:id/text()", 
        namespaces=nsmap) 
print(result) 

выход:

['{someid}'] 
+0

Я не мог найти хорошую ссылку на XPath, и кажется, что lxml реализует только подмножество спецификации. Я искал пространство имен xml, для RDF и т. Д., Я просто думаю, что где-то есть ошибка в документации, и я не хотел тратить слишком много времени на эту чрезвычайно простую задачу. – erjoalgo

+0

@erjoalgo 'lxml' имеет [* полную поддержку * XPath версии 1.0] (http://lxml.de/xpathxslt.html). Вы можете прочитать [W3School's] (http://www.w3schools.com/xpath/xpath_syntax.asp) для стартера и ознакомиться с [официальной спецификацией XPath 1.0] (http://www.w3.org/TR/xpath/) для получения полной информации – har07

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