Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何基于文本节点的值添加xml节点_Python_Xml_Xpath_Lxml - Fatal编程技术网

Python 如何基于文本节点的值添加xml节点

Python 如何基于文本节点的值添加xml节点,python,xml,xpath,lxml,Python,Xml,Xpath,Lxml,我正在玩找到的xml文件@ 如果节点的值name=“Espresso”,我想插入一个节点 例如,我想换成: <clade> <name>Espresso</name> <branch_length>2.0</branch_length> </clade> 此时,应该可以使用lxml.etree.Element创建xml节点,并使用insert将它们附加到xml文档中 然而,虽然这在理论上听起来很棒,但我无法让它工作。 我非

我正在玩找到的xml文件@

如果节点的值
name=“Espresso”
,我想插入一个节点

例如,我想换成:

<clade>
<name>Espresso</name>
<branch_length>2.0</branch_length>
</clade>
此时,应该可以使用
lxml.etree.Element
创建xml节点,并使用insert将它们附加到xml文档中

然而,虽然这在理论上听起来很棒,但我无法让它工作。

我非常感谢您提供的任何帮助/建议

您的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"]')
>>DOC=”“”
…浓缩咖啡
... 2.0
... """
>>> 
>>>导入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>
>对于匹配中的e:
...    同级=lxml.etree.Element(“url”)
...    sibling.text=“www.espresso.com”
...    e、 addnext(兄弟姐妹)
>>>打印lxml.etree.tostring(树)
浓缩咖啡www.espresso.com
2
编辑:

由于您的文档有一个名称空间,因此您希望将名称空间映射传递给XPath函数,并使用名称空间前缀作为标记名的前缀,如下所示:

>>> nsmap = {'phylo': 'http://www.phyloxml.org'}
>>> tree.xpath('//phylo:name[text()="Espresso"]', namespaces=nsmap)
[<Element {http://www.phyloxml.org}name at 0x2c875f0>]
nsmap={'phylo':'http://www.phyloxml.org'} >>>xpath('//phylo:name[text()=“Espresso”]”,名称空间=nsmap) []
谢谢。使用示例文档,代码非常有效。但是,使用实际文件时,它似乎不起作用。@样式化-可能会失败,因为实际文件具有默认名称空间。@样式化添加了有关namespace@jterrace,再次感谢!我接受了答案。你能告诉我一些有关名称空间的背景知识吗?在xml中使用名称空间有什么好处?没问题。你应该看报纸。对于一些背景,可能是?
>>> 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>
>>> nsmap = {'phylo': 'http://www.phyloxml.org'}
>>> tree.xpath('//phylo:name[text()="Espresso"]', namespaces=nsmap)
[<Element {http://www.phyloxml.org}name at 0x2c875f0>]