2011-10-31 130 views
3

我在python下使用libxml2。不幸的是,這個庫的Python版本實際上記錄得很糟糕,我從那裏創建了很少的例子,我可以理解一些方法。python libXML2刪除項目

我所管理的加入很快TE的一種XML節點。由於這個元素應該替換現有的元素,所以我想刪除之前的元素,但是我找不到刪除孩子的方法。

有誰知道什麼是方法的名字嗎?有沒有人有關於這個圖書館的體面文件?

乾杯

回答

5

您可以使用unlinkNode()方法刪除給定節點。在一般情況下,大多數適用於節點記錄的方法,嘗試:

pydoc libxml2.xmlNode 

對於unlinkNode,該文件說:

unlinkNode(self) 
    Unlink a node from it's current context, the node is not 
    freed 

例如,假設該輸入:

<html> 
    <head> 
    <title>Document Title</title> 
    </head> 
    <body> 
    <div id="content">This is a test.</div> 
    </body> 
</html> 

您可以分析這樣的文件:

>>> import libxml2 
>>> doc = libxml2.parseFile('input.html') 

找到<div>節點是這樣的:

>>> node = doc.xpathEval('//*[@id="content"])[0] 

,並刪除它像這樣:

>>> node.unlinkNode() 

現在,如果你打印出來的文檔,你會得到這樣的:

>>> print doc 
<head>    
    <title>Document Title</title> 
</head> 
<body> 

</body> 
</html> 
+0

pydoc命令的岩石。我不知道! :) – Stefano

+0

完美。抱歉打擾,但我是這個圖書館的新手。你知道爲什麼當我添加一些項目,它們都在同一行上廣告?你知道如何得到一個漂亮的代表嗎?非常感謝他幫助你已經給我了! :) – Stefano

+1

如果因爲某些原因你不需要使用這個庫,我真的會推薦移植到lxml,這是一個pythonic更多,並有更好的文檔。 – larsks

1

你的意思是你使用的是lxml綁定的libxml2?他們被合理記錄在IMO的http://lxml.de/

它提到元素列表。因此,您可以使用remove列表功能刪除節點。

import lxml 
root = lxml.etree.Element("root") 
child2 = lxml.etree.SubElement(root, "child2") 
child3 = lxml.etree.SubElement(root, "child3") 
print lxml.etree.tostring(root) 
# "<root><child2/><child3/></root>" 
root.remove(child2) 
print lxml.etree.tostring(root) 
# "<root><child3/></root>" 
+1

我想他是在談論這個:http://xmlsoft.org/python.html – aukaost

+0

好吧...沒有真的,我實際上直接使用libxml2「import libxml2」 – Stefano

+0

exaclty這一個...它非常快速,但文檔真的倒。我發現這裏的源,但很難獲取信息了:http://www.mit.edu/activities/anime/arch/i386_rhel4/pkg/vlc-0.8.6d/contrib/lib/python2.3/site-packages/ libxml2.py – Stefano

0

爲了完整起見,如果要刪除的項目是屬性unsetProp是選擇的方法:

... 
if node.hasProp('myAttributeName'): 
    node.usetProp('myAttributeName') 

有沒有人有關於此庫的體面的文檔?

This libxml2 documentation幫助了我很多。