6

WebサイトとWebサイトフォームの構成に使用される汎用XMLファイルを標準化するPythonスクリプトを作成しようとしています。ただし、これを行うには、要素の元の属性の順序を維持するか、事前定義された方法で要素を再配置できるようにします。現在、私が試したほとんどのxmlパーサーは、属性の順序を英数字に書き直してみました。これらのXMLファイルは人間による読み取り/書き込みおよび保守であるため、これはあまり役に立ちません。

たとえば、一般的な要素はXMLでは次のようになります。

<Question QuestionRef="XXXXX" DataType="Integer" Text="Question Text" Availability="Shown" DefaultAnswer="X">

ただし、elementtreeを通過して新しいファイルに再書き込みされると、これは次のように変更されます。

<Question Availability="Shown" DataType="Integer" DefaultAnswer="X" PartType="X" QuestionRef="XXXXX" Text="Question Text">

スクリプトの目的は、同僚間の読みやすさを向上させるために多数のXMLファイルを標準化することであり、要素の属性に含まれる情報の重要度はさまざまであるため(たとえば、QuestionRefは非常に重要です)、属性が賢明に注文する。

Python dict(属性が格納されている)は当然順序付けられておらず、XML仕様では属性の順序付けは重要ではないと述べていますが、これは人間の可読性の要因がスクリプトの背後にある原動力です。

これに似た他の質問(Stack Overflow)で、pxdomがこれを実行できると述べているのを見ました(質問リンク:link)が、pxdomのドキュメントまたはGoogle検索を使用してこれを実行する方法についての言及は見つかりません。では、属性の順序を維持したり、現在のXMLパーサーで定義したりする方法はありますか?できればホットパッチに頼らずに:)!

誰もが提供できるどんな助けでも大歓迎です:)。

4

1 に答える 1

9


以下に説明するようにモンキーパッチを適用します::ElementTree.pyファイルには_serialize_xml;という名前の関数があります。
この関数では; 下記のパッチを適用します。

        ##for k, v in sorted(items):  # remove the sorted here
        for k, v in items:
            if isinstance(k, QName):
                k = k.text
            if isinstance(v, QName):
                v = qnames[v.text]
            else:
                v = _escape_attrib(v, encoding)
            write(" %s=\"%s\"" % (qnames[k], v))

ここ; を削除して、上記sorted(items)と同じitemsようにします。

また、名前空間に基づく並べ替えを無効にします(上記のパッチでは、xml属性に名前空間が存在する場合でも並べ替えは存在します。それ以外の場合は、名前空間が存在しない場合、上記は正常に機能します)。そのためには、すべて{}collections.OrderedDict()fromに置き換えますElementTree.py

これで、すべての属性をそのxml要素に追加したので、順番に並べることができます。

上記のすべてを行う前に; に存在するFredrikLundhによる著作権メッセージを読むElementTree.py

于 2013-01-10T13:15:36.253 に答える