Python Lxml:添加和删除标签 [英] Python Lxml: Adding and deleting tags

查看:821
本文介绍了Python Lxml:添加和删除标签的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在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 do root.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] and node.attrib[attr] = value, make sure the value is str though);
  • it might be useful to use etree.XML('<myelement><child/></myelement>') for creating new nodes.

希望有帮助。

这篇关于Python Lxml:添加和删除标签的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆