首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有什么Python XML解析器是为人类而设计的?

有没有什么Python XML解析器是为人类而设计的?
EN

Stack Overflow用户
提问于 2009-09-29 17:22:35
回答 4查看 5.6K关注 0票数 24

我喜欢Python,但我不想仅仅为了从元素中获取属性而编写10行代码。也许只是我,但minidom不是那种mini。为了使用它来解析某些东西,我必须编写的代码看起来很像Java代码。

有没有更像user-friendly的东西?一些重载操作符,以及哪些将元素映射到对象?

我希望能够访问以下内容:

代码语言:javascript
复制
<root>
<node value="30">text</node>
</root>

如下所示:

代码语言:javascript
复制
obj = parse(xml_string)
print obj.node.value

并且不使用getChildren或其他类似的方法。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-29 17:35:42

你应该看看ElementTree。它做的不完全是你想要的,但它比minidom要好得多。如果我没记错的话,从python2.4开始,它包含在标准库中。要获得更快的速度,请使用cElementTree。要获得更多、更快(以及更多特性),您可以使用lxml (根据您的需要/方法查看objectify API )。

我应该补充说,BeautifulSoup在一定程度上满足了您的需求。也有Amara采用了这种方法。

票数 21
EN

Stack Overflow用户

发布于 2009-09-29 18:32:15

实际上,我编写了一个库,它的功能完全符合您的想象。这个库名为"xe“,您可以从以下位置获得它:http://home.avvanta.com/~steveha/xe.html

xe可以导入XML,让您以面向对象的方式处理数据。它实际上使用xml.dom.minidom进行解析,然后遍历生成的树并将数据打包到xe对象中。

编辑:好的,我已经用xe实现了你的例子,所以你可以看看它是如何工作的。下面是实现您所展示的XML的类:

代码语言:javascript
复制
import xe

class Node(xe.TextElement):
    def __init__(self, text="", value=None):
        xe.TextElement.__init__(self, "node", text)
        if value is not None:
            self.attrs["value"] = value

class Root(xe.NestElement):
    def __init__(self):
        xe.NestElement.__init__(self, "root")
        self.node = Node()

下面是使用上述方法的一个示例。我将示例XML放入名为"example.xml“的文件中,但您也可以将其放入字符串中并传递该字符串。

代码语言:javascript
复制
>>> root = Root()
>>> print root
<root/>
>>> root.import_xml("example.xml")
<Root object at 0xb7e0c52c>
>>> print root
<root>
    <node value="30">text</node>
</root>
>>> print root.node.attrs["value"]
30
>>>

请注意,在本例中,"value“的类型将是一个字符串。如果您确实需要另一种类型的属性,也可以通过一些工作来实现,但我没有为这个示例而烦恼。(如果查看PyFeed,就会发现有一个类的属性不是文本。)

票数 3
EN

Stack Overflow用户

发布于 2012-10-05 17:33:24

我同样需要简单的xml解析器,在花了很长时间检查不同的库之后,我发现了xmltramp

基于您的示例xml:

代码语言:javascript
复制
import xmltramp

xml_string = """<root>
<node value="30">text</node>
</root>"""

obj = xmltramp.parse(xml_string)
print obj.node('value')             # 30
print str(obj.node)                 # text

我找不到比这更好用的了。

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

https://stackoverflow.com/questions/1493899

复制
相关文章

相似问题

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