【问题标题】:decorate xml subtree with lxml用 lxml 装饰 xml 子树
【发布时间】:2013-10-29 22:10:35
【问题描述】:

我想转换这个 xml 树

<doc>
  <a>
    <op>xxx</op>
  </a>
</doc>

<doc>
  <a>
    <cls>
      <op>xxx</op>
    </cls>
  </a>
</doc>

我使用这个 python 代码

from lxml import etree
f = etree.fromstring('<doc><a><op>xxx</op></a></doc>')

node_a = f.xpath('/doc/a')[0]
ele = etree.Element('cls')
node_a.insert(0, ele)

node_cls = f.xpath('/doc/a/cls')[0]
node_op = f.xpath('/doc/a/op')[0] 
node_cls.append(node_op) 
print etree.tostring(f, pretty_print=True)

这是最好的解决方案吗?

现在我想获得

<cls>
  <doc>
    <a>
      <op>xxx</op>    
    </a>
  </doc>
</cls>

我找不到任何解决方案。

感谢您的帮助。

【问题讨论】:

  • 你的问题是什么?
  • 在第一种情况下,我想添加 arround xxx 。在第二种情况下,我想添加 arround ...

标签: python xml lxml


【解决方案1】:

比起,我更喜欢使用。我觉得更容易处理。

这两个问题都可以用同样的方法解决,首先找到元素,获取它的父元素,创建新元素并将旧元素放入其中。

from bs4 import BeautifulSoup
import sys 

soup = BeautifulSoup(open(sys.argv[1], 'r'), 'xml')
for e in soup.find_all(sys.argv[2]):
    p = e.parent
    cls = soup.new_tag('cls')
    e_extracted = e.extract()
    cls.append(e_extracted)
    p.append(cls)

print(soup.prettify())

脚本接受两个参数,第一个是xml 文件,第二个是用新标签包围的标签。像这样运行它:

python3 script.py xmlfile op

产生:

<?xml version="1.0" encoding="utf-8"?>
<doc>
 <a>
  <cls>
   <op>
    xxx
   </op>
  </cls>
 </a>
</doc>

对于&lt;doc&gt;,运行如下:

python3 script.py xmlfile doc

结果如下:

<?xml version="1.0" encoding="utf-8"?>
<cls>
 <doc>
  <a>
   <op>
    xxx
   </op>
  </a>
 </doc>
</cls>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-11
    • 1970-01-01
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多