質問

PythonのElementTreeオブジェクト構造を使用してXMLを作成しようとしています。処理手順に関しては、すべて非常にうまく機能します。 Factory関数ProcessingTruction()を使用してPIを簡単に作成できますが、ElementTreeに追加されません。手動で追加することはできますが、PIが通常配置されているルート要素の上に追加する方法を理解できません。誰かがこれを行う方法を知っていますか?私はそれを行う多くの代替方法を知っていますが、これは私が見つけられない場所に構築されなければならないようです。

役に立ちましたか?

解決

試してみてください lxml ライブラリ:ElementTree APIに続き、さらに多くの追加が追加されます。から 互換性の概要:

ElementTreeは、XMLを解析するときにコメントと処理の指示を無視しますが、Etreeはそれらを読み取り、コメントまたは処理導入要素としてそれぞれ扱います。これは、テキストコンテンツ内にコメントが見つかる場合に特に表示され、コメント要素によって分割されます。

ブールを渡すことで、この動作を無効にすることができます remove_comments および/または remove_pis 使用するパーサーに対するキーワード引数。便利さやポータブルコードをサポートするために、 etree.ETCompatXMLParser デフォルトの代わりに etree.XMLParser. 。可能な限りElementTreeパーサーに近いデフォルトのセットアップを提供しようとします。

stdlibではなく、私は知っていますが、私の経験では、標準の要素ツリーが提供していないものが必要なときに最善の策です。

他のヒント

LXML APIを使用すると、簡単にはなりませんが、少し「不足」です。

トップレベルの処理命令が必要な場合は、次のように作成します。

from lxml import etree

root = etree.Element("anytagname")
root.addprevious(etree.ProcessingInstruction("anypi", "anypicontent"))

結果のドキュメントは次のようになります。

<?anypi anypicontent?>
<anytagname />

IMOはこの細かいAPIを際立たせる別の機能であるため、彼らは確かにこれをFAQに追加する必要があります。

ええ、私はそれが可能だとは思わない、ごめんなさい。 ElementTreeは、DOMよりも(非字の範囲)要素中心のXML処理へのよりシンプルなインターフェイスを提供しますが、その価格はXML Infoset全体をサポートしていないということです。

ルート要素の外側にあるコンテンツを表す明確な方法はありません(コメント、PIS、Doctype、XML宣言)。これらもパース時に破棄されます。 (さて:これには、DTD内部サブセットで指定されたデフォルトの属性が含まれているように見えます。これにより、ElementTreeは、非準拠のXMLプロセッサに厳密に話すことができます。)

おそらく、PythonネイティブElementTree実装のサブクラス化またはモンキーパッチで回避できます write() 呼び出す方法 _write _writeingの前にあなたの余分なPIで _root, 、しかし、それは少し脆弱かもしれません。

完全なXML Infosetのサポートが必要な場合は、おそらくDOMに最適です。

ElementTreeについてはあまり知りません。しかし、「Xe」と呼ばれるライブラリを使用して問題を解決できる可能性があります。

XEは、構造化されたXMLを簡単に作成できるように設計されたPythonクラスのセットです。私はさまざまな理由で長い間それに取り組んでいませんが、あなたがそれについて質問があるか、バグが修正されているかどうかを喜んで助けてくれるでしょう。

処理の手順などのサポートの裸の骨があり、少しの作業があれば、必要なことができると思います。 (処理手順を追加し始めたとき、私はそれらを本当に理解していませんでしたし、それらを必要としなかったので、コードは一種の中途半端です。)

見て、それが有用であると思われるかどうかを確認してください。

http://home.avvanta.com/~steveha/xe.html

これを使用する例は次のとおりです。

import xe
doc = xe.XMLDoc()

prefs = xe.NestElement("prefs")
prefs.user_name = xe.TextElement("user_name")
prefs.paper = xe.NestElement("paper")
prefs.paper.width = xe.IntElement("width")
prefs.paper.height = xe.IntElement("height")

doc.root_element = prefs


prefs.user_name = "John Doe"
prefs.paper.width = 8
prefs.paper.height = 10

c = xe.Comment("this is a comment")
doc.top.append(c)

上記のコードを実行してから実行した場合 print doc これがあなたが得るものです:

<?xml version="1.0" encoding="utf-8"?>
<!-- this is a comment -->
<prefs>
    <user_name>John Doe</user_name>
    <paper>
        <width>8</width>
        <height>10</height>
    </paper>
</prefs>

これに興味があるが、助けが必要な場合は、お知らせください。

あなたのプロジェクトで頑張ってください。

f = open('D:\Python\XML\test.xml', 'r+')
old = f.read()
f.seek(44,0)      #place cursor after xml declaration
f.write('<?xml-stylesheet type="text/xsl" href="C:\Stylesheets\expand.xsl"?>'+ old[44:])

私は同じ問題に直面していて、私の場合の要素方法のいずれかを使用した後でも、Piを.xmlファイルに正しく挿入できなかった後、この粗いソリューションを思いつきました root.insert (0, PI) 挿入されたPIを正しい場所にカットして貼り付けて貼り付けて、予期しない場所から削除されるデータを見つけるためだけに試してみます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top