在python中的elementTree中插入xml项
如何在每次调用此方法时插入或更新匹配项在python中的elementTree中插入xml项,python,xml,elementtree,Python,Xml,Elementtree,如何在每次调用此方法时插入或更新匹配项 def makeXml(path): root = Element("modules") tree = ElementTree(root) childPath = Element(os.path.basename(path).split(".")[0]) childPath.set("path", path) root.append(childPath) print etree.tostring(root)
def makeXml(path):
root = Element("modules")
tree = ElementTree(root)
childPath = Element(os.path.basename(path).split(".")[0])
childPath.set("path", path)
root.append(childPath)
print etree.tostring(root)
当我第一次调用该方法时,它应该创建一个新条目
makeXml("~/Desktop/filterList.mod")
第一张打印的是
但我想当同一个方法执行时,它应该添加一个新的条目,如
<modules>
<filterList path="~/Desktop/filterList.mod" />
<sorter path="~/Documens/sorter.mod" />
</modules>
但是它没有发生,而是被覆盖。这是因为函数
makeXML
不是静态的,所以它不会记住关于它执行的任何其他时间的任何信息。一个简单的解决方案是将其封装在一个类中
更新:我不确定您是如何定义unique的,但我猜它可能是通过标记名或路径定义的。无论哪种方式,都只需存储所有以前看到的项目并进行检查
例如:
class makeXmlContainer:
def __init__(self):
self.root = Element("modules")
self.alreadyseen = []
def makeXml(self, path):
# Uncomment if uniqueness is defined by tag name.
#tagname = os.path.basename(path).split(".")[0]
#if tagname in self.alreadyseen:
# return
#self.alreadyseen.append(tagname)
# Uncomment if uniqueness if defined by path.
#if path in self.alreadyseen:
# return
#self.alreadyseen.append(path)
childPath = Element(os.path.basename(path).split(".")[0])
childPath.set("path", path)
self.root.append(childPath)
print etree.tostring(self.root)
演示:
>foo=makeXmlContainer()
>>>makeXml('foo/bar')
>>>foo.makeXml('bing/bang')
这是因为函数makeXML
不是静态的,因此它不会记住关于它执行的任何其他时间的任何信息。一个简单的解决方案是将其封装在一个类中
更新:我不确定您是如何定义unique的,但我猜它可能是通过标记名或路径定义的。无论哪种方式,都只需存储所有以前看到的项目并进行检查
例如:
class makeXmlContainer:
def __init__(self):
self.root = Element("modules")
self.alreadyseen = []
def makeXml(self, path):
# Uncomment if uniqueness is defined by tag name.
#tagname = os.path.basename(path).split(".")[0]
#if tagname in self.alreadyseen:
# return
#self.alreadyseen.append(tagname)
# Uncomment if uniqueness if defined by path.
#if path in self.alreadyseen:
# return
#self.alreadyseen.append(path)
childPath = Element(os.path.basename(path).split(".")[0])
childPath.set("path", path)
self.root.append(childPath)
print etree.tostring(self.root)
演示:
>foo=makeXmlContainer()
>>>makeXml('foo/bar')
>>>foo.makeXml('bing/bang')
非常好,但如果同一条目已存在,则会添加另一条。非常好,但如果同一条目已存在,则会添加另一条。
>>> foo = makeXmlContainer()
>>> foo.makeXml('foo/bar')
<modules><bar path="foo/bar"/></modules>
>>> foo.makeXml('bing/bang')
<modules><bar path="foo/bar"/><bang path="bing/bang"/></modules>