Skip to main content
 首页 » 编程设计

python之使用 lxml 访问带和不带命名空间的元素

2025年05月04日12xxx_UU

有没有一种方法可以使用 lxml 在有和没有命名空间的文档中同时搜索相同的元素?例如,我想获取元素 identifier 的所有出现,无论它是否与特定命名空间相关联。我目前只能按如下方式单独访问它们。

代码:

from lxml import etree 
 
xmlfile = etree.parse('xmlfile.xml') 
root = xmlfile.getroot() 
 
for l in root.iter('identifier'): 
   print l.text 
 
for l in root.iter('{http://www.openarchives.org/OAI/2.0/provenance}identifier'): 
   print l.text 

文件:xmlfile.xml

<?xml version="1.0"?> 
<record> 
  <header> 
    <identifier>identifier1</identifier> 
    <datestamp>datastamp1</datestamp> 
    <setSpec>setspec1</setSpec> 
  </header> 
  <metadata> 
    <oai_dc:dc xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:oai_dc="http://www.openarchives.org/OAI/2.0/oai_dc/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/oai_dc/ http://www.openarchives.org/OAI/2.0/oai_dc.xsd"> 
      <dc:title>title1</dc:title> 
      <dc:title>title2</dc:title> 
      <dc:creator>creator1</dc:creator> 
      <dc:subject>subject1</dc:subject> 
      <dc:subject>subject2</dc:subject> 
    </oai_dc:dc> 
  </metadata> 
  <about> 
    <provenance  xmlns="http://www.openarchives.org/OAI/2.0/provenance" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.openarchives.org/OAI/2.0/provenance http://www.openarchives.org/OAI/2.0/provenance.xsd"> 
      <originDescription altered="false" harvestDate="2011-08-11T03:47:51Z"> 
        <baseURL>baseURL1</baseURL> 
        <identifier>identifier3</identifier> 
        <datestamp>datestamp2</datestamp> 
        <metadataNamespace>xxxxx</metadataNamespace> 
        <originDescription altered="false" harvestDate="2010-10-10T06:15:53Z"> 
          <baseURL>xxxxx</baseURL> 
          <identifier>identifier4</identifier> 
          <datestamp>2010-04-27T01:10:31Z</datestamp> 
          <metadataNamespace>xxxxx</metadataNamespace> 
        </originDescription> 
      </originDescription> 
    </provenance> 
  </about> 
</record> 

请您参考如下方法:

您可以使用 XPath 来解决此类问题:

from lxml import etree 
 
xmlfile = etree.parse('xmlfile.xml') 
identifier_nodes = xmlfile.xpath("//*[local-name() = 'identifier']")