2017-09-06 59 views
0

我有xml與命名空間,在那裏我能夠得到元素的值。 我想用不同的文本更新值。但是我想根據<vlid>標記值更新XML。如果此vlid值不匹配,則只有程序應迭代下一個vlink標記並查找匹配的文本。我可以匹配vlid。我能夠更新XML,但在我的情況下,值全部更新爲link標籤,而不考慮vlid的值。更新xml元素值和更新某些標籤

我的問題是我有兩個標籤,其中link裏面有相同的元素列表,並且使用xpath進行遞歸搜索,因此在標籤中找到了這兩個元素。我無法想象如何將其限制爲單個元素。

這裏是XML文件

<vtest 
    xmlns="test:file"> 
    <lsm> 
     <m-id>v1</m-id> 
     <name>v1</name> 
     <communication>bi</communication> 
     <link> 
      <vlid>text</vlid> 
      <idx>text</idx> 
      <type>text</type> 
      <link>text</link> 
      <vl-p> 
       <Type>text</Type> 
       <n-type>text</n-type> 
       <n-id>text</n-id> 
       <k-name>text</k-name> 
       <k-id>text</k-id> 
       <t-name>text</t-name> 
       <l-work>text</l-work> 
       <t-id>text</t-id> 
       <is-required>text</is-required> 
      </vl-p> 
     </link> 
     <link> 
      <vlid>text</vlid> 
      <idx>text</idx> 
      <type>text</type> 
      <link>text</link> 
      <vl-p> 
       <Type>text</Type> 
       <n-type>text</n-type> 
       <n-id>text</n-id> 
       <k-name>text</k-name> 
       <k-id>text</k-id> 
       <t-name>text</t-name> 
       <l-work>text</l-work> 
       <t-id>text</t-id> 
       <is-required>text</is-required> 
      </vl-p> 
     </link> 
    </lsm> 
</vtest> 

這裏是我的代碼

def update_ld(root, ns, k-name, t-name, n-id, t-id, Type, type): 
    """ Update VLDs with Openstack Values.! """ 
    for vld_list in root.xpath('.//ns:type', namespaces=ns): 
     vld_list.text = type 
    for vld_list in root.xpath('.//ns:Type', namespaces=ns): 
     vld_list.text = Type 
    for vld_list in root.xpath('.//ns:k-name', namespaces=ns): 
     vld_list.text = k_name 
    for vld_list in root.xpath('.//ns:n-id', namespaces=ns): 
     vld_list.text = n_id 
    for vld_list in root.xpath('.//ns:t-name', namespaces=ns): 
     vld_list.text = t_name 
    for vld_list in root.xpath('.//ns:t-id', namespaces=ns): 
     vld_list.text = t_id 
etree.ElementTree(root).write(xmlfile, pretty_print='True') 
+0

你怎麼罵你的函數'update_ld'與xml的根目錄,還是首先選擇了一個元素? – PRMoureu

+0

@PRMoureu:我使用xml的根目錄調用'update_ld'。 – tgcloud

回答

1

update_ld應該是這樣的:

def update_ld(element, ns, k-name, t-name, n-id, t-id, Type, type): 
    element.xpath('./type').text = type 
    element.xpath('./Type').text = Type 
    element.xpath('./k_name').text = k_name 
    element.xpath('./n_id').text = n_id 
    element.xpath('./t_name').text = t_name 
    element.xpath('./t_id').text = t_id 

# Find all <link> from root 
for link in root.xpath('./link'): 
    # find all <vl-p> from this <link> 
    # Should find only One 
    update_ld(link.xpath('./vl-p')[0], ...)