2

私は壊れた XML-RPC サーバーを使用しています。修正を求めるサポート リクエストを送信しましたが、utf-8 応答のバイト長が文字数として報告され、文字数が切り捨てられるというバグがあります。私が受け取っているXML。

これは近いうちに修正されると思いますが、現在、一連のツールの一部としてこれを調査しており、実際に機能させる必要があります。現在、私は xmlrpclib にモンキーパッチを適用して、例外の解析を逆にし、パーサーに応答の修正バージョンを手動でフィードできるようにしていますが、XML の性質を考慮すると、プログラムでこれを行う方法が必要であり、したがって、このバグがないかのように XML-RPC サーバー。

切り捨ての量は終了タグの一部にすぎないため、壊れた 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 に答える