Python 基于attrib的xml搜索与编辑

Python 基于attrib的xml搜索与编辑,python,xml,Python,Xml,我试图基于id搜索XML,然后为id与搜索匹配的XML添加标记。 目前我有这个xml qw - - 0 1. A. - 0 1. A. 我需要机会,例如,id为=“1”的人 你知道怎么做吗?谢谢大家! 使用解析器是解决这个问题的方法。我最喜欢使用lxml,所以这就是我在这里的答案中要用到的,但是还有其他的你可以选择 import lxml.etree as ET 首先要做的是以某种方式读入XML。这里,我假设它是一个字符串 xml = """<structure> &

我试图基于id搜索XML,然后为id与搜索匹配的XML添加标记。 目前我有这个xml

qw
-
-
0
1.
A.
-
0
1.
A.
我需要机会,例如,id为=“1”的人



你知道怎么做吗?谢谢大家!

使用解析器是解决这个问题的方法。我最喜欢使用
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>"""
现在我们有了一个很好的树结构。我们需要找到您要更改的标签。为了找到有问题的标签,我将使用XPATH。如果您不熟悉XPATH,那么它并不是最平滑的过程,因此我建议您研究如何准确地选择所需内容。这是一个很好的教程,其中有一些交互式示例,您可以随意使用。我相信这些例子都是HTML的,但是这些想法是可以转移的。在我们这里的示例中,我们发现一个id为1的标签

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

下一个任务是创建新标签。您可以随意添加属性,但作为一个简单的示例,我们只添加一个名为“mynewtag”的简单标记

mynewtag=ET.Element(“mynewtag”)

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

target.append(newtag)

现在对树进行了更改!剩下要做的就是打印出结果XML。我们将树转换回字符串,然后将其打印出来。decode调用是因为
tostring
方法返回一个字节字符串,我希望换行符正确呈现。
pretty\u print
选项使输出…非常漂亮

print(ET.tostring(tree,pretty\u print=True)。解码(“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>

0
1.
A.
0
1.
A.

如果您有任何其他问题,请随时询问。

我假设XML已经以某种方式读取过。您会接受这样一种解决方案,即读入XML,添加元素,然后返回一个新的XML输出吗?是的,我确实读入了XML,并将元素放入其中。当然,如果你说你想添加一个标记,那么这个解决方案会很好。但您显示的标签是自动关闭的。你想让它看起来像
,还是让新标签跟在id后面?我的错,我的例子不对。我编辑了它,标签不是自动关闭的,我的新标签必须在里面。很乐意帮忙:)
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>"""
parser = ET.XMLParser(remove_blank_text=True)
tree = ET.fromstring(xml, parser=parser)
<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>