2017-09-06 42 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], ...)