2012-05-15 38 views
1

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

我预计这个问题很快就会被解决,但是我目前正在研究这个工具,并且真的需要让它工作。目前,我有猴子补丁xmlrpclib来反向解析异常,并允许我手动为解析器提供修正版本的响应,但考虑到XML的本质,必须有一种方法以编程方式执行此操作,因此允许我使用XML-RPC服务器就好像它没有这个bug一样。

截断的数量只是结束标记的一部分,所以如果有一种内置的方式来获取破坏的xml树,请将其转换为所有标记关闭,然后解析它,这将允许我得到与我的工作 - 我目前正在滚动我自己的,但任何帮助将不胜感激,我无法想象我是第一个想要在xml上执行错误更正的人,但如果我不' t找到一个预先解决的解决方案,我会推我的git并从这里链接它。

回答

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()