首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >良好的python XML解析器用于处理名称空间繁重的文档。

良好的python XML解析器用于处理名称空间繁重的文档。
EN

Stack Overflow用户
提问于 2010-09-24 09:08:13
回答 3查看 6.2K关注 0票数 9

Python elementTree似乎无法使用名称空间。我有什么选择?BeautifulSoup在名称空间方面也很垃圾。我不想把他们剥掉。

关于特定python库如何获取命名空间元素的示例,它们的集合都是+1。

编辑:,你能用你选择的库来提供处理这个真实世界用例的代码吗?

如何获得字符串‘换行’、'2.6‘和一个列表'PYTHON’、'XML‘、’XML-命名空间‘

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<zs:searchRetrieveResponse
    xmlns="http://unilexicon.com/vocabularies/"
    xmlns:zs="http://www.loc.gov/zing/srw/"
    xmlns:dc="http://purl.org/dc/elements/1.1/"
    xmlns:lom="http://ltsc.ieee.org/xsd/LOM">
    <zs:records>
        <zs:record>
            <zs:recordData>
                <srw_dc:dc xmlns:srw_dc="info:srw/schema/1/dc-schema">
                    <name>Line Break</name>
                    <dc:title>Processing XML namespaces using Python</dc:title>
                    <dc:description>How to get contents string from an element,
                        how to get a collection in a list...</dc:description>
                    <lom:metaMetadata>
                        <lom:identifier>
                            <lom:catalog>Python</lom:catalog>
                            <lom:entry>2.6</lom:entry>
                        </lom:identifier>
                    </lom:metaMetadata>
                    <lom:classification>
                        <lom:taxonPath>
                            <lom:taxon>
                                <lom:id>PYTHON</lom:id>
                            </lom:taxon>
                        </lom:taxonPath>
                    </lom:classification>
                    <lom:classification>
                        <lom:taxonPath>
                            <lom:taxon>
                                <lom:id>XML</lom:id>
                            </lom:taxon>
                        </lom:taxonPath>
                    </lom:classification>
                    <lom:classification>
                        <lom:taxonPath>
                            <lom:taxon>
                                <lom:id>XML-NAMESPACES</lom:id>
                            </lom:taxon>
                        </lom:taxonPath>
                    </lom:classification>
                </srw_dc:dc>
            </zs:recordData>
        </zs:record>
        <!-- ... more records ... -->
    </zs:records>
</zs:searchRetrieveResponse>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-09-24 11:03:53

lxml是命名空间感知的.

代码语言:javascript
复制
>>> from lxml import etree
>>> et = etree.XML("""<root xmlns="foo" xmlns:stuff="bar"><bar><stuff:baz /></bar></root>""")
>>> etree.tostring(et, encoding=str) # encoding=str only needed in Python 3, to avoid getting bytes
'<root xmlns="foo" xmlns:stuff="bar"><bar><stuff:baz/></bar></root>'
>>> et.xpath("f:bar", namespaces={"b":"bar", "f": "foo"})
[<Element {foo}bar at ...>]

编辑:在您的示例中:

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

# remove the b prefix in Python 2
# needed in python 3 because
# "Unicode strings with encoding declaration are not supported."
et = etree.XML(b"""...""")

ns = {
    'lom': 'http://ltsc.ieee.org/xsd/LOM',
    'zs': 'http://www.loc.gov/zing/srw/',
    'dc': 'http://purl.org/dc/elements/1.1/',
    'voc': 'http://www.schooletc.co.uk/vocabularies/',
    'srw_dc': 'info:srw/schema/1/dc-schema'
}

# according to docs, .xpath returns always lists when querying for elements
# .find returns one element, but only supports a subset of XPath
record = et.xpath("zs:records/zs:record", namespaces=ns)[0]
# in this example, we know there's only one record
# but else, you should apply the following to all elements the above returns

name = record.xpath("//voc:name", namespaces=ns)[0].text
print("name:", name)

lom_entry = record.xpath("zs:recordData/srw_dc:dc/"
                         "lom:metaMetadata/lom:identifier/"
                         "lom:entry",
                         namespaces=ns)[0].text

print('lom_entry:', lom_entry)

lom_ids = [id.text for id in
           record.xpath("zs:recordData/srw_dc:dc/"
                        "lom:classification/lom:taxonPath/"
                        "lom:taxon/lom:id",
                        namespaces=ns)]

print("lom_ids:", lom_ids)

输出:

代码语言:javascript
复制
name: Frank Malina
lom_entry: 2.6
lom_ids: ['PYTHON', 'XML', 'XML-NAMESPACES']
票数 13
EN

Stack Overflow用户

发布于 2010-09-24 09:12:44

不如:

http://docs.python.org/library/pyexpat.html

票数 1
EN

Stack Overflow用户

发布于 2010-09-24 09:54:50

libxml (http://xmlsoft.org/)是xml解析的最佳、更快的库。有用于python的实现。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3785629

复制
相关文章

相似问题

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