Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
修复损坏的xml的Python方法_Python_Xml_Xml Parsing - Fatal编程技术网

修复损坏的xml的Python方法

修复损坏的xml的Python方法,python,xml,xml-parsing,Python,Xml,Xml Parsing,我正在处理一个损坏的XML-RPC服务器,虽然我已经提交了一个修复它的支持请求,但有一个错误,它将utf-8响应的bytellength报告为字符计数,从而导致我接收的XML被截断 我希望这个问题很快会得到解决,但我目前正在研究这一问题,将其作为一套工具的一部分,并且确实需要让它工作起来。目前,我已经对xmlrpclib进行了猴子补丁,以反转异常解析,并允许我手动向解析器提供响应的更正版本,但考虑到XML的性质,必须有一种方法以编程方式完成此操作,因此允许我使用XML-RPC服务器,就好像它没有

我正在处理一个损坏的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_文档()