我正在尝试使用Python修改XML。
基本上,我想做的是查看元素的“ condition”属性,并基于我XML中的remove / keep元素。我还需要我的代码来了解属性何时具有“ not”或“ or”条件(不确定是否可以使用python和lxml实现)。
在下面的示例XML中,我想查询一下,如果条件condition = 1,它将删除除包含condition =“ 1”的元素以外的所有其他元素。并且它只应删除实际上具有条件属性的那些元素,因此标题元素应保留,因为它根本没有条件属性。
原始XML:
<book>
<chapter id="hi" condition="2">Item 3</chapter>
<chapter id="hi" condition="1 or 2">Item 3</chapter>
<chapter id="hi" condition="1">Item 2</chapter>
<title title="Test">Item 1</title>
</book>
所以,如果“条件” = 1->
输出XML(应如下所示):
<book>
<chapter id="hi" condition="1 or 2">Item 3</chapter>
<chapter id="hi" condition="1">Item 2</chapter>
<title title="Test">Item 1</title>
</book>
我尝试使用xpath / lxml等不同的查询,只是不明白如何解决这个问题,甚至可以使用Python吗?
谢谢!
答案 0 :(得分:0)
您可以使用BeautifulSoup。
使用BeautifulSoup()
从输入XML的字符串版本创建BeautifulSoup
对象。
from bs4 import BeautifulSoup
soup = BeautifulSoup(x, "xml")
BeautifulSoup()
的第二个参数指定解析器。参见this。
现在让我们创建一个变量n
,该变量具有要找到的值,在您给出的示例中,该值为1
。
n = 1
使用find_all()
遍历soup
中存在的所有标签。
for t in soup.find_all():
....
现在使用has_attr()
查看代码是否具有名为'condition'
的属性。
if t.has_attr('condition'):
....
如果存在这样的属性,则可以使用t['condition']
获取其值。拆分由此获得的字符串以从中获取整数(假设它是您想要的整数)以获取操作数列表。 if x.isdigit()
用于摆脱and
,or
等。
operand_list = [int(x) for x in t['condition'].split() if x.isdigit()]
如果n
不在操作数列表中,请使用decompose()
从XML树中删除标签。
if n not in operand_list:
t.decompose()
循环结束后,让我们打印使用prettify()
函数格式化的结果XML:
print(soup.prettify())
将所有部分拼凑在一起,最终程序将是
n = 1
for t in soup.find_all():
if t.has_attr('condition'):
operand_list = [int(x) for x in t['condition'].split() if x.isdigit()]
if n not in operand_list:
t.decompose()
print(soup.prettify())
输出应为
<book>
<chapter condition="1 or 2" id="hi">
Item 3
</chapter>
<chapter condition="1" id="hi">
Item 2
</chapter>
<title title="Test">
Item 1
</title>
</book>