【问题标题】:Accessing child XML elements with XPATH in Python在 Python 中使用 XPATH 访问子 XML 元素
【发布时间】:2015-09-22 20:40:27
【问题描述】:

我正在解析这个 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">

【问题讨论】:

  • for b in a.xpath('.//Constant'): ?
  • @splash58 不,不幸的是,这不起作用。
  • @splash58 不,这也不起作用。
  • 不要使用dropbox链接,请将xml文件的相关内容粘贴到这里(不是完整的xml文件)

标签: python xml python-2.7 xpath xml-parsing


【解决方案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']

【讨论】:

  • 啊,是的,这行得通。谢谢。然而,这给了我太多的答案。我希望每个常量出现一次 - 我该怎么做?
  • 每个常量只会出现一次,xml里可能有那么多常量
  • 不,只有大约 20 个,会产生负载。因为有两个for循环,不会有重复吗?
  • 不,每个外部for循环迭代每个不同的反应元素,然后内部for循环迭代每个反应元素中的每个常量元素。所以这两个 for 循环不会导致重复,但您的代码中可能还有其他原因导致这种情况?
  • 整个 xml 中只有 26 个 标签,所以这段代码必须创建重复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-15
  • 2018-06-27
  • 1970-01-01
  • 2018-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多