4

ElementTree を使用して XML ファイルを解析しています。一部のフィールドには、HTML データがあります。たとえば、次のような宣言を考えてみましょう。

<Course>
    <Description>Line 1<br />Line 2</Description>
</Course>

ここで、_course がこの Couse 要素を保持する Element 変数であるとします。このコースの説明にアクセスしたいので、次のようにします。

desc = _course.find("Description").text;

ただし、 desc には「Line 1」しか含まれていません。私は .tail 属性について何かを読んだので、私も試しました:

desc = _course.find("Description").tail;

そして、同じ出力が得られます。
desc を "Line 1 Line 2" (または文字通り と の間の何か)にするにはどうすればよいですか? 言い換えれば、C# (および私が推測する他の多くの言語) の .innerText プロパティに似たものを探しています。

4

4 に答える 4

3

xmlファイルの作成を制御できますか?この問題を回避するには、xmlタグ(または同様のもの)またはマークアップ文字(''など)を含むxmlタグの内容を<エンコードする必要があります。これは、次のいずれかで実行できます。

  • CDATAセクション_
  • Base64またはその他のエンコーディング(xml予約文字を含まない)
  • エンティティエンコーディング(' <' ==' &lt;')

これらの変更を行うことができず、ElementTreeがxmlスキーマに含まれていないタグを無視できない場合は、ファイルを前処理する必要があります。もちろん、スキーマがhtmlと重複している場合は、運が悪いです。

于 2009-07-06T18:22:37.567 に答える
3

間違った要素から tail 属性を読み取ろうとしています。試す

desc = _course.find("br").tail;

tail 属性は、混合コンテンツの XML ファイルを読み取るときに末尾のテキスト ノードを格納するために使用されます。要素の直後に続くテキストは、その要素の tail 属性に格納されます。

    <tag><elem>これは elem の
    テキスト属性</elem>これは
    elem のテール属性</tag>

xml/xhtml のすべての要素からテキストと末尾の属性を出力する単純なコード スニペット。

xml.etree.ElementTree を ET としてインポート

def processElem(elem):
    elem.text が None でない場合:
        elem.text を出力
    elem の子の場合:
        processElem(子)
        child.tail が None でない場合:
            child.tail を印刷

xml = '''<コース>
    <Description>1 行目<br />2 行目 <span>子テキスト </span>子テール</Description>
    </コース>'''

ルート = ET.fromstring(xml)
processElem(ルート)

出力:

ライン1
2行目
子テキスト
子尻尾

より良い解決策については、http://code.activestate.com/recipes/498286-elementtree-text-helper/を参照してください。合わせて変更可能です。

PS 次の投稿で引用されているように、user839338 から名前を変更しました

于 2011-07-11T17:13:53.223 に答える
1

「<」や「&」などの文字は、XML要素では無効です。

「<」は、パーサーが新しい要素の開始として解釈するため、エラーを生成します。

「&」は、パーサーが文字エンティティの開始として解釈するため、エラーを生成します。

JavaScriptコードなどの一部のテキストには、多くの「<」または「&」文字が含まれています。エラーを回避するために、スクリプトコードをCDATAとして定義できます。

CDATAセクション内のすべては、パーサーによって無視されます。

CDATAセクションは""で始まります:

詳細情報:http ://www.w3schools.com/xmL/xml_cdata.asp

お役に立てれば!

于 2009-07-06T18:25:28.230 に答える
1

user839338 の回答に触発されて、私は行かず、このような合理的な解決策を探しました。

>>> from xml.etree import ElementTree as etree
>>> corpus = '''<Course>
...     <Description>Line 1<br />Line 2</Description>
... </Course>'''
>>> 
>>> doc = etree.fromstring(corpus)
>>> desc = doc.find("Description")
>>> desc.tag = 'html'
>>> etree.tostring(desc)
'<html>Line 1<br/>Line 2</html>\n'
>>> 

周囲のタグ (元は<Description>) を削除する簡単な方法はありませんが、必要に応じて使用できるものに簡単に変更できます<div><span>

于 2011-07-15T17:46:02.687 に答える