2

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

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

截断的数量只是结束标签的一部分,所以如果有一种内置的方法来获取损坏的 xml 树,在关闭所有标签的情况下转储它,然后改为解析它,它可以让我继续我的工作- 我目前正在考虑自己滚动,但任何帮助将不胜感激,我无法想象我是第一个想要对 xml 执行纠错的人,但如果我找不到解决方案预制我会把我的推到 git 并从这里链接它。

4

1 回答 1

4

这是一个快速的片段 - 关键是 sax 解析器会在它们通过时生成事件,因此它们允许您处理内容直到它中断的点。

#!/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()
于 2012-05-15T16:04:09.577 回答