2015-07-05 6 views
0

Я разбор этого XML-файл: https://www.dropbox.com/s/i6hga7nvmcd6rxx/ct.cps?dl=0Доступ к ребенку XML-элементы с XPATH в Python

Из каждого <Reaction> тега Я хочу, чтобы его атрибута name и атрибута его <Constant> детей name.

from lxml import etree 

NSMAP = {"c": "http://www.copasi.org/static/schema"} 

parsed = etree.parse('ct.cps') 

for a in parsed.xpath("//c:Reaction", namespaces=NSMAP): 
    print a.attrib['name'] 

я могу получить доступ к каждому из name атрибутов двух элементов, используя код выше. Однако, когда я нахожусь на одной итерации элементов <Reaction>, как я могу получить доступ к подэлементам и перечислить их?

Я попытался это:

for a in parsed.xpath("//c:Reaction", namespaces=NSMAP): 
    for b in a.xpath('Constant'): 
     print b.attrib['name'] 

Но это не работает.

Вот образец XML

</rdf:RDF> 
     </MiriamAnnotation> 
     </Metabolite> 
    </ListOfMetabolites> 
    <ListOfReactions> 
     <Reaction key="Reaction_0" name="v1" reversible="false" fast="false"> 
     <MiriamAnnotation> 
<rdf:RDF xmlns:dcterms="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
    <rdf:Description rdf:about="#Reaction_0"> 
    <dcterms:created> 
     <rdf:Description> 
     <dcterms:W3CDTF>2015-06-16T22:13:07Z</dcterms:W3CDTF> 
     </rdf:Description> 
    </dcterms:created> 
    </rdf:Description> 
</rdf:RDF> 
     </MiriamAnnotation> 
     <ListOfSubstrates> 
      <Substrate metabolite="Metabolite_5" stoichiometry="1"/> 
     </ListOfSubstrates> 
     <ListOfModifiers> 
      <Modifier metabolite="Metabolite_9" stoichiometry="1"/> 
     </ListOfModifiers> 
     <ListOfConstants> 
      <Constant key="Parameter_4344" name="Kcat" value="433.724"/> 
      <Constant key="Parameter_4343" name="km" value="479.617"/> 
     </ListOfConstants> 
     <KineticLaw function="Function_40"> 
      <ListOfCallParameters> 
      <CallParameter functionParameter="FunctionParameter_264"> 
       <SourceParameter reference="Parameter_4344"/> 
      </CallParameter> 
      <CallParameter functionParameter="FunctionParameter_254"> 
       <SourceParameter reference="Metabolite_9"/> 
      </CallParameter> 
      <CallParameter functionParameter="FunctionParameter_258"> 
       <SourceParameter reference="Metabolite_5"/> 
      </CallParameter> 
      <CallParameter functionParameter="FunctionParameter_266"> 
       <SourceParameter reference="Parameter_4343"/> 
      </CallParameter> 
      </ListOfCallParameters> 
     </KineticLaw> 
     </Reaction> 
     <Reaction key="Reaction_1" name="v2" reversible="false" fast="false"> 
     <MiriamAnnotation> 
<rdf:RDF xmlns:dcterms="http://purl.org/dc/terms/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> 
    <rdf:Description rdf:about="#Reaction_1"> 
+0

'для Ь в a.xpath ('.// Constant'):'? – splash58

+0

@ splash58 Нет, к сожалению, это не работает. – Charon

+0

@ splash58 Нет, это не работает печально. – Charon

ответ

2

Когда родительский элемент в XML имеет пространство имен, ребенок также в том же пространстве имен (если явно не указано в элементе XML), поэтому, когда вы пытаетесь для поиска их с помощью XPATH вам также нужно будет указать пространство имен для детей.

Попробуйте следующее -

for a in parsed.xpath("//c:Reaction", namespaces=NSMAP): 
    for b in a.xpath(".//c:Constant", namespaces=NSMAP): 
     print b.attrib['name'] 
+0

Ах да, это работает. Благодарю. Однако это дает мне слишком много ответов. Идентификатор точно так же, как каждая константа появится один раз - как бы я это сделал? – Charon

+0

Каждая константа будет появляться только один раз, может быть много констант в xml –

+0

Нет, только около 20, что создает нагрузки. Потому что для циклов два, не будет ли повторений? – Charon

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