Pythonic修复破碎的xml的方法

时间:2012-05-15 15:31:16

标签: python xml xml-parsing

我正在使用一个损坏的XML-RPC服务器,虽然我已经提交了一个支持请求来修复它,但是有一个错误,它将utf-8响应的字节长度报告为字符数,导致截断我收到的XML。

我希望很快就能解决这个问题,不过我目前正在研究这个工具是一组工具的一部分,而且确实需要让它工作。目前我使用猴子修补xmlrpclib来反转异常解析,并允许我手动为解析器提供更正的响应版本,但考虑到XML的性质,必须有一种方法以编程方式执行此操作,因此允许我使用XML-RPC服务器好像没有这个bug。

截断量只是结束标记的一部分,所以如果有一种内置的方法来获取破碎的xml树,请在关闭所有标记的情况下转储它,然后解析它,这样我就可以继续与我的工作 - 我目前正在寻找自己的工作,但任何帮助将非常感激,我无法想象我是第一个想要在xml上执行纠错的人,但如果我不找到预先制定的解决方案我会将我的git推送到git并从此处链接。

1 个答案:

答案 0 :(得分:4)

这里是一个快速片段 - 关键是萨克斯解析器在事件发生时会生成事件,因此它们允许您处理内容直至其中断的点。

#!/usr/bin/env python

import sys
from xml.sax import handler, make_parser

class TagHandler(handler.ContentHandler):
    def __init__(self):
        handler.ContentHandler.__init__(self)

        self.stack = []


    def startElement(self, name, attrs):
        self.stack.append(name)

    def endElement(self, name):
        # TODO: might want to just confirm that the element matches the top of the stack here
        self.stack.pop()


    def finish_document(self):
        return "\n".join(["</%s>" % tag for tag in reversed(self.stack)])


parser = make_parser()
handler = TagHandler()
parser.setContentHandler(handler)

try:
    parser.parse(sys.argv[1])

except:
    # TODO: something more intelligent than just printing out the
    # constructed end of the document. Like appending it to the source
    # and repeating whatever you did to make this processing necessary.
    print handler.finish_document()