我正在尝试根据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>
任何想法该怎么做?谢谢!
答案 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>
如果您还有其他疑问,请随时提出。