5

@ http://www.jsphylosvg.com/examples/source.php?example=2&t=xmlで見つかった xml ファイルをいじっています。

node の値が node の場合、ノードを挿入したいと思いますname="Espresso"

たとえば、次のように変更したいと思います。

<clade>
<name>Espresso</name>
<branch_length>2.0</branch_length>
</clade>

に:

<clade>
<name>Espresso</name>
<url>www.espresso.com</url>
<branch_length>2.0</branch_length>
</clade>

これまでに行った調査に基づいて、xpathエスプレッソを含むノードを見つけるために使用できます(これは機能するはずですが、機能しませんか?)

import re, sys
import lxml.etree
f = open("test.xml", "r")
data = f.read()
tree = lxml.etree.XML(data)
if tree.xpath('//name/text()="Espresso"'):
    insert new child here

この時点で、use を使用lxml.etree.Elementして xml ノードを作成し、insert を使用してそれらを xml ドキュメントに添付できるはずです。

ただし、これは理論的には素晴らしいように思えますが、私はそれを機能させることができません。
ヘルプ/提案をいただければ幸いです

4

1 に答える 1

5

あなたの XPath ステートメントは正しくありません。ここにあなたが欲しいと思うものがあります:

>>> DOC = """<clade>
... <name>Espresso</name>
... <branch_length>2.0</branch_length>
... </clade>"""
>>> 
>>> import lxml.etree
>>> tree = lxml.etree.XML(DOC)
>>> matches = tree.xpath('//name[text()="Espresso"]')

次に、一致の後に要素を追加します。

>>> for e in matches:
...    sibling = lxml.etree.Element("url")
...    sibling.text = "www.espresso.com"
...    e.addnext(sibling)

>>> print lxml.etree.tostring(tree)
<clade>
<name>Espresso</name><url>www.espresso.com</url>
<branch_length>2.0</branch_length>
</clade>

編集:

ドキュメントにはネームスペースがあるため、ネームスペース マップを XPath 関数に渡し、次のようにタグ名の前にネームスペース プレフィックスを付ける必要があります。

>>> nsmap = {'phylo': 'http://www.phyloxml.org'}
>>> tree.xpath('//phylo:name[text()="Espresso"]', namespaces=nsmap)
[<Element {http://www.phyloxml.org}name at 0x2c875f0>]
于 2012-08-13T02:40:19.540 に答える