[英]search and edit xml based on attrib
我正在嘗試根據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>
任何想法如何做到這一點? 謝謝!
使用解析器是前往此處的方法。 我對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>"""
現在可以完成實際工作了。 首先,我們分析樹,以便我們不處理原始文本,而是處理結構化對象。 我們將使用特殊的解析器,以便稍后能夠獲得良好的打印輸出。 可以在這里找到更多詳細信息。
parser = ET.XMLParser(remove_blank_text=True)
tree = ET.fromstring(xml, parser=parser)
因此,現在我們有了一個不錯的樹結構。 我們需要找到您要更改的標簽。 要查找有問題的標簽,我將使用XPATH。 如果您不熟悉XPATH,那么它並不是最平滑的過程,因此,我建議您研究一下如何准確選擇所需的內容。 這是一個非常不錯的教程,其中包含您可以使用的交互式示例。 我相信這些示例都是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>
如果您還有其他問題,請隨時提出。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.