2016-06-08 72 views
1

我有以下XML -如何在Python中使用lxml中的xpath找到的标签添加属性?

<draw:image></draw:image> 

我想多XLink属性添加到它,让它 -

<draw:image xlink:href="image" xlink:show="embed"></draw:image> 

我尝试使用下面的代码,但得到的错误“ValueError异常:无效的属性名字u'xlink:href'“

root.xpath("//draw:image", namespaces= 
{"draw":"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0"}) 
[0].attrib['xlink:href'] = 'image' 

我在做什么错?似乎有一些与命名空间有关的东西,但我无法弄清楚什么。

+0

你可以添加一个链接到实际的文件?或者至少有一个与名称空间decs等可用的版本,.. –

+0

@PadraicCunningham啊。好的。这里是命名空间 - https://gist.github.com/shrox/df592e65a8848dd4f0ddab18cc340dd4 –

+0

你能添加一个淡化版本的文件吗?向你展示一个完整的例子会更容易。 –

回答

1

这是一个工作示例:

from lxml import etree as et 

xml = et.parse("your.xml") 
root = xml.getroot() 
d = root.nsmap 

for node in root.xpath("//draw:image", namespaces=d): 
    node.attrib["{http://www.w3.org/1999/xlink}href"] = "value" 
    node.attrib["{http://www.w3.org/1999/xlink}show"] = "embed" 
print(et.tostring(xml)) 

这为:

<?xml version="1.0" encoding="utf-8"?> 
<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"> 
<draw:image></draw:image> 

输出:

<office:document xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:meta:1.0" xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0"> 
<draw:image xlink:href="value" xlink:show="embed"/> 


</office:document> 

或者使用set:

for node in root.xpath("//draw:image", namespaces=d): 
    node.set("{http://www.w3.org/1999/xlink}href", "image") 
    node.set("{http://www.w3.org/1999/xlink}show", "embed") 
+0

你不知道你一直很有帮助。自从昨天以来,我一直很难理解名称空间是如何工作的,这已经为我简化了它。谢谢! –

相关问题