首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python2.7lxml中的命名空间访问xml文件中的值

使用python2.7lxml中的命名空间访问xml文件中的值
EN

Stack Overflow用户
提问于 2016-03-25 20:48:22
回答 1查看 149关注 0票数 1

我按照这个链接来尝试获取几个标记的值:

Parsing XML with namespace in Python via 'ElementTree'

在这个链接中,访问这样的根标记没有问题:

代码语言:javascript
复制
import sys
from lxml import etree as ET


doc = ET.parse('file.xml')

namespaces_rdf = {'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#'} # add more as needed
namespaces_dcat = {'dcat': 'http://www.w3.org/ns/dcat#'} # add more as needed
namespaces_dct = {'dct': 'http://purl.org/dc/terms/'}

print doc.findall('rdf:RDF', namespaces_rdf)
print doc.findall('dcat:Dataset', namespaces_dcat)
print doc.findall('dct:identifier', namespaces_dct)

产出:

代码语言:javascript
复制
[]
[<Element {http://www.w3.org/ns/dcat#}Dataset at 0x2269b98>]
[]

我只能访问dcat:Dataset,我看不出如何访问rdf:about的值

和以后访问dct:标识符

当然,一旦我访问了这个信息,我需要访问dcat:分发信息。

这是我的示例文件,由ckanext-dcat生成:

代码语言:javascript
复制
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
  xmlns:dct="http://purl.org/dc/terms/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:dcat="http://www.w3.org/ns/dcat#"
>
  <dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01">
    <dct:identifier>ec631628-2f46-4f17-a685-d62a37466c01</dct:identifier>
    <dct:description>FOO-Description</dct:description>
    <dct:title>FOO-title</dct:title>
    <dcat:keyword>keyword1</dcat:keyword>
    <dcat:keyword>keyword2</dcat:keyword>
    <dct:issued rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2014-10-08T08:55:04.566618</dct:issued>
    <dct:modified rdf:datatype="http://www.w3.org/2001/XMLSchema#dateTime">2015-06-25T11:04:10.328902</dct:modified>
    <dcat:distribution>
      <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f">
        <dct:title>FOO-title-1</dct:title>
        <dct:description>FOO-Description-1</dct:description>
        <dcat:accessURL>http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f/download/myxls.xls</dcat:accessURL>
        <dct:format>XLS</dct:format>
      </dcat:Distribution>
    </dcat:distribution>
    <dcat:distribution>
      <dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f">
        <dct:format>XLS</dct:format>
        <dct:title>FOO-title-2</dct:title>
        <dct:description>FOO-Description-2</dct:description>
        <dcat:accessURL>http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f/download/myxls.xls</dcat:accessURL>
      </dcat:Distribution>
    </dcat:distribution>
  </dcat:Dataset>
</rdf:RDF>

知道如何获取这些信息吗?谢谢

更新:嗯,我需要访问rdf:关于

代码语言:javascript
复制
<dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01">

因此,以下代码摘自:

Parse xml with lxml - extract element value

代码语言:javascript
复制
for node in doc.xpath('//dcat:Dataset', namespaces=namespaces):
   # Iterate over attributes
   for attrib in node.attrib:
            print '@' + attrib + '=' + node.attrib[attrib]

我得到了这个输出:

代码语言:javascript
复制
[<Element {http://www.w3.org/ns/dcat#}Dataset at 0x23d8ee0>]
@{http://www.w3.org/1999/02/22-rdf-syntax-ns#}about=http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01

因此,问题是:

如何询问属性是否为有关以获取此值,因为在其他文件中,我有几个标记。

更新2:修正了我如何获得价值(克拉克符号)

代码语言:javascript
复制
for node in doc.xpath('//dcat:Dataset', namespaces=namespaces):
   # Iterate over attributes
   for attrib in node.attrib:
      if attrib.endswith('about'):
        #do my jobs

好了,快完成了,但我还有最后一个问题:我需要知道什么时候访问

<dct:title>

属于它的,我有:

代码语言:javascript
复制
<dcat:Dataset rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01">
       <dct:title>FOO-title</dct:title>

<dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/f5707551-6bf3-468f-9a96-b4184cc51d1f">
        <dct:title>FOO-title-1</dct:title>

<dcat:Distribution rdf:about="http://www.myweb.com/dataset/ec631628-2f46-4f17-a685-d62a37466c01/resource/74c1acc8-b2b5-441b-afb2-d072d0d00a7f">
        <dct:title>FOO-title-2</dct:title>

如果我做了这样的事,我会得到:

代码语言:javascript
复制
for node in doc.xpath('//dct:title', namespaces=namespaces):
   print node.tag, node.text

{http://purl.org/dc/terms/}title FOO-title
{http://purl.org/dc/terms/}title FOO-title-1
{http://purl.org/dc/terms/}title FOO-title-2

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-25 20:54:33

使用带有xpath()命名参数的namespaces方法:

代码语言:javascript
复制
namespaces = {
    'rdf': 'http://www.w3.org/1999/02/22-rdf-syntax-ns#',
    'dcat': 'http://www.w3.org/ns/dcat#',
    'dct': 'http://purl.org/dc/terms/'
}

print(doc.xpath('//rdf:RDF', namespaces=namespaces))
print(doc.xpath('//dcat:Dataset', namespaces=namespaces))
print(doc.xpath('//dct:identifier', namespaces=namespaces))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36227777

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档