基于attrib搜索和编辑xml

时间:2018-06-25 03:39:12

标签: python xml

我正在尝试根据id搜索XML,然后为该id与我的搜索匹配的标签添加标签。 目前我有这个XML      

<tag>qw</tag>


-<work>

    <label id="1"/>

    <label id="2"/>

    <label id="3"/>


 -<search>

    <since>0</since>

    <to>1</to>

    <input>a</input>

</search>


-<search>

    <since>0</since>

    <to>1</to>

    <input>a</input>

</search>

</work>

</structure>

例如,我需要碰巧一个id =“ 1”的人

  <label id="1">
    <mynewtag/>
  </label>

任何想法该怎么做?谢谢!

1 个答案:

答案 0 :(得分:0)

使用解析器是前往此处的方法。我对lxml最满意,这就是我在这里的答案所要使用的内容,但是您可以选择其他选项。

import lxml.etree as ET

要做的第一件事是以某种方式读取XML。在这里,我只是假设它在字符串中。

xml = """<structure>
    <work>
        <label id="1"/>
        <label id="2"/>
        <label id="3"/>
        <search>
            <since>0</since>
            <to>1</to>
            <input>a</input>
        </search>
        <search>
            <since>0</since>
            <to>1</to>
            <input>a</input>
        </search>
    </work>
</structure>"""

现在可以在上面完成实际的工作了。首先,我们分析树,以便我们不处理原始文本,而是处理结构化对象。我们将使用特殊的解析器,以便稍后能够获得良好的打印输出。可以找到更多详细信息here

parser = ET.XMLParser(remove_blank_text=True)
tree = ET.fromstring(xml, parser=parser)

所以现在我们有了一个不错的树结构。我们需要找到您要更改的标签。要查找有问题的标签,我将使用XPATH。如果您不熟悉XPATH,那么它并不是最平滑的过程,因此,我建议您研究一下如何准确选择所需的内容。 Here是一个非常不错的教程,其中包含您可以使用的交互式示例。我相信这些示例都是HTML格式的,但是这些想法是可以移植的。在此处的示例中,我们找到了一个ID为1的标签。

target = tree.find(".//label[@id='1']")

接下来的业务是创建新标签。您可以随意添加属性,但作为一个最小的示例,我们将仅添加一个名为“ mynewtag”的简单标签。

mynewtag = ET.Element("mynewtag")

让我们将创建的标签添加到我们之前找到的标签中。由于只有一个元素,因此我将使用append。但是,如果顺序对您很重要(例如,您希望它成为某些其他元素的第一个子元素),则可以使用insert而不是append。

target.append(newtag)

现在已经对树进行了更改!剩下要做的就是打印出结果XML。我们将树变回字符串,然后将其打印出来。进行解码调用是因为tostring方法返回一个字节字符串,并且我希望正确显示换行符。 pretty_print选项使输出...漂亮。

print(ET.tostring(tree, pretty_print=True).decode("UTF-8"))

到此,我们完成了!我们的输出如下所示。

<structure>
  <work>
    <label id="1">
      <mynewtag/>
    </label>
    <label id="2"/>
    <label id="3"/>
    <search>
      <since>0</since>
      <to>1</to>
      <input>a</input>
    </search>
    <search>
      <since>0</since>
      <to>1</to>
      <input>a</input>
    </search>
  </work>
</structure>

如果您还有其他疑问,请随时提出。