Python Lxml:添加和删除标签 [英] Python Lxml: Adding and deleting tags
问题描述
我正在尝试在xml树中添加和删除标签(下面的剪辑)。我有一个布尔值的dict,用于确定是添加还是删除标签。如果该值为true,并且该元素不存在,则它将创建该标记(如果该值不存在)。如果是false,它会删除该值。
I am attempting to add and remove tags in an xml tree (snip below). I have a dict of boolean values that I use to determine whether to add or remove a tag. If the value is true, and the element does not exist, it creates the tag (and its parent if it doesn't exist). If false, it deletes the value.
但是,似乎不起作用,我找不到原因。
However, it doesn't seem to work, and I can't find out why.
<Assets>
<asset name="Adham">
<pos>
<x>27913.769923</x>
<y>5174.627773</y>
</pos>
<GFX>
<space>P03.png</space>
<exterior>snow.png</exterior>
</GFX>
<presence>
<faction>Dvaered</faction>
<value>10.000000</value>
<range>1</range>
</presence>
<general>
<class>P</class>
<population>100</population>
<services>
<land/>
<refuel/>
</services>
<commodities/>
<description>Fooo</description>
<bar>(null)</bar>
</general>
</asset>
</Assets>
代码:
def writeflagX(self, root, x_path, _flag):
''' Writes flag to tree: deletes if false and already exists
and adds if true but doesn't exist yet)
'''
try:
if root.xpath(x_path):
if not self.flag[_flag]:
#delete value
temp1 = root.xpath(x_path)
temp1.getparent().remove(temp1)
print "removed"
#yeah, pretty ugly
except AttributeError:
#element does not exist, so create it if true value is here
#first, see if parent tag of list items exists, create it if neccesary
#split xpath into leader and item
leader = x_path.split("/")[0]
print leader
item = x_path.split("/")[1]
try:
if root.xpath(leader): #try to see if parent tag exists
child = etree.Subelement(root.xpath(leader), item)
print "no errors"
print "not caught"
except AttributeError:
l2 = leader.split("/")[0]
print l2 + " hi"
try:
l3 = leader.split("/")[1]
if l3: #if this tag is not a direct child of the root
child1 = etree.Subelement(root.xpath(l2), l3)
child1.append(etree.Element(item))
print "no dex error"
except IndexError: #if this tag is a direct child of the root
print "dex error"
child2 = etree.SubElement(root, l2)
def writeALLflagsX(self, _root):
'''Uses writeflagX and sets all the flags
'''
for k in self.flag:
self.writeflagX(_root, self.flagPaths[k], k)
I尝试将任务标志从false更改为true,并将加油标志从true更改为false。
I try to change the mission flag from false to true, and the refuel flag from true to false.
#Change Missions to true and refuel to false
foo = Asset()
###parsing code###
foo.alist["Adham"].flag["Is_missions"] = True
foo.alist["Adham"].flag["Is_refuel"] = False
foo.alist["Adham"].writeALLflagsX(foo.alist["Adham"].node)
foo.writeXML("output.xml")
我被骗了任务标签没有被添加,加油标签没有被删除。
I am stumped. The missions tag does not get added and the refuel tag does not get deleted.
这是否与我嵌套try / except语句有关?
Does this have something to do with me nesting the try/except statements?
编辑:
好的,通过使用for循环修正删除问题:
Ok, fixed the deleting problem by using a for loop as suggested:
temp1 = root.xpath(x_path)
for n in temp1:
n.getparent().remove(n)
仍然无法添加节点。
我想要设置一个新问题更简单,因为这太复杂了。
I think I am going to set up a new question that is simpler, since this is too convoluted.
编辑编辑:更好的新问题:如何使用xpath处理添加元素和他们的父母
Edit edit: new question that is much better: How to handle adding elements and their parents using xpath
推荐答案
有几件事情可以改进在代码中:
There are several things could be improved in the code:
-
node.xpath
返回节点列表 - 即你不能执行root.xpath(path).getparen t()
,检查列表,如果您确定它应该存在,则选择节点#0(节点删除代码使用此); - 使用属性尝试使用
node.attrib
字典。使用属性变得像修改python字典一样简单(del node.attrib [attr]
和node.attrib [attr] = value
,确保值
是str
虽然); - 使用
etree.XML('< myelement>< child />< / myelement>')
来创建新节点可能是有用的。
node.xpath
returns the list of nodes - i.e. you can't doroot.xpath(path).getparent()
, check the list and take the node #0 if you're sure that it should exist (you node deletion code uses this);- when working with attributes try using
node.attrib
dictionary. Working with attributes becomes as easy as modifying python dictionary (del node.attrib[attr]
andnode.attrib[attr] = value
, make sure thevalue
isstr
though); - it might be useful to use
etree.XML('<myelement><child/></myelement>')
for creating new nodes.
希望有帮助。
这篇关于Python Lxml:添加和删除标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!