簡體   English   中英

基於attrib搜索和編輯xml

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM