修复损坏的xml的Python方法
我正在处理一个损坏的XML-RPC服务器,虽然我已经提交了一个修复它的支持请求,但有一个错误,它将utf-8响应的bytellength报告为字符计数,从而导致我接收的XML被截断 我希望这个问题很快会得到解决,但我目前正在研究这一问题,将其作为一套工具的一部分,并且确实需要让它工作起来。目前,我已经对xmlrpclib进行了猴子补丁,以反转异常解析,并允许我手动向解析器提供响应的更正版本,但考虑到XML的性质,必须有一种方法以编程方式完成此操作,因此允许我使用XML-RPC服务器,就好像它没有此错误一样修复损坏的xml的Python方法,python,xml,xml-parsing,Python,Xml,Xml Parsing,我正在处理一个损坏的XML-RPC服务器,虽然我已经提交了一个修复它的支持请求,但有一个错误,它将utf-8响应的bytellength报告为字符计数,从而导致我接收的XML被截断 我希望这个问题很快会得到解决,但我目前正在研究这一问题,将其作为一套工具的一部分,并且确实需要让它工作起来。目前,我已经对xmlrpclib进行了猴子补丁,以反转异常解析,并允许我手动向解析器提供响应的更正版本,但考虑到XML的性质,必须有一种方法以编程方式完成此操作,因此允许我使用XML-RPC服务器,就好像它没有
截断量只是结束标记的一部分,因此,如果有一种内在的方法来获取损坏的xml树,在关闭所有标记的情况下转储它,然后解析它,这将允许我继续我的工作-我目前正在考虑自己滚动,但任何帮助都将不胜感激,我无法想象我是第一个想要对xml执行错误更正的人,但是如果我没有找到预先制定的解决方案,我会将我的解决方案推到git上,并从这里链接它。这里有一个快速的片段-关键是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()
#/usr/bin/env python
导入系统
从xml.sax导入处理程序中,生成语法分析器
类TagHandler(handler.ContentHandler):
定义初始化(自):
ContentHandler.\uuuu init\uuuuu(self)
self.stack=[]
def startElement(自身、名称、属性):
self.stack.append(名称)
定义元素(自身、名称):
#TODO:可能只想确认元素与堆栈顶部匹配
self.stack.pop()
def finish_文档(自我):
返回“\n”.join([“”%tag for tag in reversed(self.stack)])
parser=make_parser()
handler=TagHandler()
setContentHandler(处理程序)
尝试:
parser.parse(sys.argv[1])
除:
#TODO:比打印出
#文档的结尾。就像把它附加到源代码一样
#重复你所做的一切,使这一过程成为必要。
打印处理程序.finish_文档()
这里有一个简短的片段-关键是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()
#/usr/bin/env python
导入系统
从xml.sax导入处理程序中,生成语法分析器
类TagHandler(handler.ContentHandler):
定义初始化(自):
ContentHandler.\uuuu init\uuuuu(self)
self.stack=[]
def startElement(自身、名称、属性):
self.stack.append(名称)
定义元素(自身、名称):
#TODO:可能只想确认元素与堆栈顶部匹配
self.stack.pop()
def finish_文档(自我):
返回“\n”.join([“”%tag for tag in reversed(self.stack)])
parser=make_parser()
handler=TagHandler()
setContentHandler(处理程序)
尝试:
parser.parse(sys.argv[1])
除:
#TODO:比打印出
#文档的结尾。就像把它附加到源代码一样
#重复你所做的一切,使这一过程成为必要。
打印处理程序.finish_文档()