我正在使用一个损坏的XML-RPC服务器,虽然我已经提交了一个支持请求来修复它,但是有一个错误,它将utf-8响应的字节长度报告为字符数,导致截断我收到的XML。
我希望很快就能解决这个问题,不过我目前正在研究这个工具是一组工具的一部分,而且确实需要让它工作。目前我使用猴子修补xmlrpclib来反转异常解析,并允许我手动为解析器提供更正的响应版本,但考虑到XML的性质,必须有一种方法以编程方式执行此操作,因此允许我使用XML-RPC服务器好像没有这个bug。
截断量只是结束标记的一部分,所以如果有一种内置的方法来获取破碎的xml树,请在关闭所有标记的情况下转储它,然后解析它,这样我就可以继续与我的工作 - 我目前正在寻找自己的工作,但任何帮助将非常感激,我无法想象我是第一个想要在xml上执行纠错的人,但如果我不找到预先制定的解决方案我会将我的git推送到git并从此处链接。
答案 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()