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