【问题标题】:update xml element value and update certain tags更新 xml 元素值并更新某些标签
【发布时间】:2017-09-06 18:08:33
【问题描述】:

我有带有命名空间的 xml,我可以在其中获取元素的值。 我想用不同的文本更新值。但是我想根据<vlid> 标签值更新 XML。如果此 vlid 值不匹配,则只有程序应遍历下一个 vlink 标记并查找匹配的文本。

我可以匹配vlid。我能够更新 XML,但是在我的情况下,所有 link 标签中的值都会更新,而与 vlid 值无关。

我的问题是我有两个以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')

【问题讨论】:

  • 如何使用 xml 的根或使用您首先选择的元素调用您的函数 update_ld
  • @PRMoureu:我用 xml 的根调用 update_ld

标签: python xml python-2.7 lxml


【解决方案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], ...)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-23
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多