在 Python 中使用 XPATH 访问子 XML 元素

Accessing child XML elements with XPATH in Python

我正在解析这个 XML 文件:https://www.dropbox.com/s/i6hga7nvmcd6rxx/ct.cps?dl=0

我想要每个 <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">

当 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']