4

XML を開き、タグとその内容全体を削除し、XML 内で他のタグを移動しようとしています。

ここに私の元のインポートxmlがあります:

<?xml version="1.0" encoding="UTF-8"?>
<package>
    <language>en-GB</language>
    <video>
        <original_spoken_locale>en-US</original_spoken_locale>
        <copyright_cline>2012 copyright</copyright_cline>
        <release_date>2012-04-23</release_date>
        <title>Amazing Film</title>
    </video>
    <provider>testprovider</provider>
</package>

<copyright_cline>タグとタグを削除する必要があり<title>ます。次に、<provider>タグをタグの上に移動してタグ<video>の下に配置し、タグを<original_spoken_locale>タグの<release_date>下に移動する必要があり<video>ます。

結果のエクスポート xml は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<package>
    <language>en-GB</language>
    <video>
        <original_spoken_locale>en-US</original_spoken_locale>
        <provider>testprovider</provider>
        <release_date>2012-04-23</release_date>
    </video>
    <release_date>2012-04-23</release_date>
</package>

lxmlのインストールに成功したので、理想的にはその解決策を探しています。

敬具。


不要なタグとそのコンテンツを削除できましたが、できれば置き換えずに、他のタグを並べ替えたり移動したりできる必要があります。また、この xml コード行を削除するのにも問題があります」

<!--Carpet ID: fd54678-->

これが私が現在持っているものです:

from lxml import etree

xmlFileIn = '/xmls/metadata.xml'
xmlFileOut = '/xmls/output.xml'

tree = etree.parse(xmlFileIn)
root = tree.getroot()

etree.strip_elements(root, 'assets')
etree.strip_tags(root, 'assets')

etree.strip_elements(root, 'chapters')
etree.strip_tags(root, 'chapters')

etree.strip_elements(root, 'xid')
etree.strip_tags(root, 'xid')

# Write the new xml file
tree.write(xmlFileOut, pretty_print=True, xml_declaration=True, encoding="utf-8")

<!--Carpet ID: fd54678-->そのため、タグを削除する必要があります。<!--.*-->真ん中の内容が変わるので、ワイルドカードを使ってこれらを削除したい. また、タグのブロックを移動する方法も知る必要があります。

4

1 に答える 1

1

まだ誰も答えていないので、試してみます。しかし、私は実験ではなく読書から進んでいます。見落としがありましたら、あらかじめお詫びいたします…。

要素を移動する方法については、「lxml.etree を使用して要素全体を移動する」を参照してください。

そこに記載されているように、テキスト ノードは lxml のノードではないため、特に注意してください (以下を参照)。

コメントに関しては、lxml でコメントを取得したり、要素を直接「移動」したりする方法が見つかりませんでした。最初に「sed」または何かでそれらを取り除くことができます。

注意事項

Elementtree、したがって lxml は、1 種類のノードのみを持つことに熱心なようです。これには、問題となる可能性のある結果がいくつかあります (「物事は可能な限り単純にする必要がありますが、単純にする必要はありません」)。

  • コメント (この場合のように) や PI を扱うのは、モデルの第一級の概念ではないため、より困難です。

  • lxml と elementtreeは、任意の XML 要素の終了タグに続くテキストをその要素のプロパティ (「テール テキスト」) にするため、テキストは特に困難です。その要素の型名、属性、および子と同等に扱われます。これはある程度機能しますが (これはチューリング マシンです)、まったく異なる考え方が必要です。

lxml について書いている人は、多くの場合、lxml は主にテキストの少ない XML 構造を対象としていると述べていることに気付きました。あなたが与えた例はそのようです。もしそうなら、あなたは幸運です。ただし、テキストが重要な場合は、次のような単純なものでも構いません。

 <p>As everyone<footnote>Well, almost everyone</footnote> knows...</p>

「知っている...」というテキストは、lxml の <footnote> ノードの一部です。脚注を移動、削除、または置換すると、テキストも一緒に表示されます。しかしもちろん、そのテキストは脚注の一部ではありません(結局、脚注が終了した後に発生しました)。

lxml が「みんなのように」で何をするのかわかりません。要素の終了直後には来ません。lxml がそれを処理する方法については何も見つかりませんでした。

そのため、どこかにテキスト コンテンツがある場合は十分に注意してください。

于 2014-01-06T05:26:13.337 に答える