-1

我想转换这个 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>

我找不到任何解决方案。

谢谢你的帮助。

4

1 回答 1

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>

对于<doc>,像这样运行它:

python3 script.py xmlfile doc

结果如下:

<?xml version="1.0" encoding="utf-8"?>
<cls>
 <doc>
  <a>
   <op>
    xxx
   </op>
  </a>
 </doc>
</cls>
于 2013-10-29T22:32:23.610 回答