6

プレフィックスを使用しているが、対応する名前空間宣言がない XML ファイルが多数あります。

次のようなもの:

<tal:block tal:condition="foo">
...
</tal:block>

また:

<div i18n:domain="my-app">
...

これらのプレフィックスがどこから来たのかはわかっています。次のことを試しましたが、成功しませんでした。

from lxml import etree as ElementTree

ElementTree.register_namespace("i18n", "http://namespaces.zope.org")
ElementTree.register_namespace("tal", "http://xml.zope.org/namespaces/tal")

with open(path) as fp:
    tree = ElementTree.parse(fp)

しかし、lxml はまだ次のように詰まる:

lxml.etree.XMLSyntaxError: Namespace prefix i18n for domain on div is not defined, line 4, column 20

を使用できることはわかっていますElementTree.XMLParser(recover=True)が、とにかくプレフィックスを保持したいのですが、この方法では保持できません。

何か案が?

4

1 に答える 1

4

これは有効な XML ではなく、未定義のプレフィックスを使用しているため、XML パーサーはそれを処理できません。

(XML を修正する以外の) 最善の策は、XML ソースをプログラムで変更して、名前空間属性をルート要素に追加することです (言語の文字列サポートを使用するだけです)。xmlns:tal="http://xml.zope.org/namespaces/tal"XML をパーサーに渡す前に、ルート要素に などを追加します。その場合、XML パーサーは問題なく処理し、名前空間を登録する必要もありません。

于 2012-05-01T04:27:29.507 に答える