0

lxml を使用して XML 要素を削除しようとしていますが、メソッドは問題ないように見えますが、機能していません。それは私のコードです:

import lxml.etree as le
f = open('Bird.rdf','r')
doc=le.parse(f)
for elem in doc.xpath("//*[local-name() = 'dc' and namespace-uri() = 'http://purl.org/dc/terms/']"):
    parent=elem.getparent().remove(elem)
print(le.tostring(doc))

サンプル XML ファイル:

<rdf:RDF xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/terms/"> 

        <wo:Class rdf:about="/nature/life/Bird#class">
                    <dc:description>Birds are a class of vertebrates. They are bipedal, warm-blooded, have a
                        covering of feathers, and their front limbs are modified into wings. Some birds, such as
                        penguins and ostriches, have lost the power of flight. All birds lay eggs. Because birds
                        are warm-blooded, their eggs have to be incubated to keep the embryos inside warm, or
                        they will perish</dc:description>
        </wo:Class>
</rdf:RDF>                  
4

1 に答える 1

4

あなたの問題は、ローカル名が「dc」(名前空間エイリアス)ではなく「説明」であることです。名前空間を xpath 関数に渡し、次のように xpath をより直接的に記述できます。

import lxml.etree as le

txt="""<rdf:RDF xmlns:rdf="http://www.w3.org/2000/01/rdf-schema#" xmlns:dc="http://purl.org/dc/terms/"
    xmlns:wo="http:/some/wo/namespace">

    <wo:Class rdf:about="/nature/life/Bird#class">
       <dc:description>Birds are a class of vertebrates. They are bipedal, warm-blooded, have a
                        covering of feathers, and their front limbs are modified into wings. Some birds, such as
                        penguins and ostriches, have lost the power of flight. All birds lay eggs. Because birds
                        are warm-blooded, their eggs have to be incubated to keep the embryos inside warm, or
                        they will perish</dc:description>
    </wo:Class>
</rdf:RDF>
"""

namespaces = { 
    "rdf":"http://www.w3.org/2000/01/rdf-schema#",
    "dc":"http://purl.org/dc/terms/",
    "wo":"http:/some/wo/namespace" }

doc=le.fromstring(txt)
for elem in doc.xpath("//dc:description", namespaces=namespaces):
    parent=elem.getparent().remove(elem)
print(le.tostring(doc))
于 2013-04-12T15:55:49.697 に答える