处理XML和Python中的属性条件

时间:2019-06-20 06:24:20

标签: python xml parsing

我正在尝试使用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吗?

谢谢!

1 个答案:

答案 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()用于摆脱andor等。

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>