如果dict.key等于同一父级中的其他XML节点,则将ET.SubElement.text设置为dict.value。

阿列克巴雷茨

因此,我用ElementTree创建了一个新的子元素,其中新节点的文本应为dict值,如果对应值的dict键等于同一父Node中另一个XML节点的文本。

XML范例:

<ns0:scaleType xmlns:ns0="http://someURL.com/">
  <scales>
    <scale>
        <names>
            <name id="0">abc</name>
            <name id="1" />
        </names>
        <alternativeExportValues>
        </alternativeExportValues>
    </scale>
    <scale>
        <names>
            <name id="0">def</name>
            <name id="1" />
        </names>
        <alternativeExportValues>
        </alternativeExportValues>
    </scale>
 </scales>
</ns0:scaleType>

CSV范例:

name;value
abc;10012
def;20025

现在的Python代码:

import xml.etree.ElementTree as ET

import csv

csvData = []

with open('myCSV.csv', 'r', encoding="utf8") as f:
    reader = csv.reader(f, delimiter=";")
    for row in reader:
        csvData.append({'name': row[0], 'value': row[1]})

tree = ET.parse('myXml.xml')
root = tree.getroot()

def my_Function():
    for p in csvData:
        for name in root.findall(".//name[@id='0']"):
            text = name.text
            if p['name'] == text:
                value = p['value']
                return value
my_Function()


for elem in root.iter('alternativeExportValues'):
    newNode = ET.SubElement(elem, 'alternativeExportValue')
    newNode.text = 

tree.write("myNewXML.xml", encoding="utf-8")

预期结果:

<ns0:scaleType xmlns:ns0="http://someURL.com/">
  <scales>
    <scale>
        <names>
            <name id="0">abc</name>
            <name id="1" />
        </names>
        <alternativeExportValues>
           <alternativeExportValue>10012</alternativeExportValue>
        </alternativeExportValues>
    </scale>
    <scale>
        <names>
            <name id="0">def</name>
            <name id="1" />
        </names>
        <alternativeExportValues>
           <alternativeExportValue>20025</alternativeExportValue>
        </alternativeExportValues>
    </scale>
 </scales>
</ns0:scaleType>


我试图将创建alternativeExportValue节点的for循环放入my_Function,但最终循环中获得了相同的值newNode.text或陷入了无限循环。

如您在预期结果中所看到的,如果
<name id="0">dict.value与同一parent中的innerText匹配,我希望dict.value作为新创建的Node的文本<scale>

丹尼尔·海利

我不确定应该做什么my_Function,但是请考虑以下逻辑:

  • 读取/处理CSV数据。(您已经在执行此操作,但可以考虑使用DictReader。这将使用第一行中的键将值映射到dict。)
  • 处理每个scale元素。
  • alternativeExportValue用“值”值创建一个新元素。
  • 检查属性值为“ 0”name元素是否与id当前“名称”条目匹配。
  • 如果是这样,请追加新alternativeExportValue元素。

例...

import xml.etree.ElementTree as ET
import csv

with open('myCSV.csv', 'r', encoding="utf8") as csvfile:
    tree = ET.parse('myXml.xml')

    for row in csv.DictReader(csvfile, delimiter=";"):
        name = row.get("name")
        new_aev_elem = ET.Element("alternativeExportValue")
        new_aev_elem.text = row.get("value")
        for scale in tree.findall(".//scale"):
            name0 = scale.find("names/name[@id='0']")
            if name0.text == name:
                aevs_elem = scale.find("alternativeExportValues")
                aevs_elem.append(new_aev_elem)
                break

    tree.write("myNewXML.xml", encoding="utf-8")

这行得通,但效率不高,因为您必须处理要修改scale的实际scale元素之前的每个元素

更糟糕的是,如果删除,break它将处理scaleXML中的每个元素(对于CSV的每一行!)。

如果可以切换到lxml,则可以使用稍微复杂一点的XPath *,它仅处理scale需要修改元素。

from lxml import etree
import csv

with open('myCSV.csv', 'r', encoding="utf8") as csvfile:
    tree = etree.parse('myXml.xml')

    uc = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    lc = "abcdefghijklmnopqrstuvwxyz"

    for row in csv.DictReader(csvfile, delimiter=";"):
        name = row.get("name").lower()
        new_aev_elem = etree.Element("alternativeExportValue")
        new_aev_elem.text = row.get("value")
        aevs_elem = tree.xpath(f".//scale[translate(names/name[@id='0'],'{uc}','{lc}')='{name}']/alternativeExportValues")[0]
        aevs_elem.append(new_aev_elem)

    tree.write("myNewXML.xml", encoding="utf-8")

* ElementTree中XPath的支持是有限的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如果Dict值为null

来自分类Dev

Sort a dict by its value pairs

来自分类Dev

我需要一个polyfill用于objectify.SubElement

来自分类Dev

如何在ElementTree(Python)中向SubElement添加属性

来自分类Dev

如何像使用num_to_word_dict(如果存在)一样通过其键访问值?

来自分类Dev

如果模拟dict,在python中为__getitem __()子类化对象的正确方法

来自分类Dev

python json dict迭代{key:value}是相同的

来自分类Dev

如果Python dict理解覆盖键,则会引发错误

来自分类Dev

PHP,如果变量isset设置id为value1,否则设置为value2

来自分类Dev

如果存在,如何比较Dict 1中键值的值为“ ==”或“!=”

来自分类Dev

ShinyTree:如果选中复选框,则将变量设置为value

来自分类Dev

检索密钥从熊猫设置一系列的dict值

来自分类Dev

MongoDB值在python中为Dict

来自分类Dev

如果x在dict.iterkey()中,则y是dict.value

来自分类Dev

使用ElementTree将新的SubElement添加到现有XML文件中

来自分类Dev

在dict中搜索列表以获取值(如果找到)返回dict标识符

来自分类Dev

在getter方法中为dict赋值

来自分类Dev

如果子字符串匹配dict键,则用dict值替换子字符串?

来自分类Dev

将dict值设置为自身会创建无限副本

来自分类Dev

大熊猫:如果其他列的任何子组中的value = yes,则将列的值设置为true

来自分类Dev

document.getElementById()。value如果为0,则将秒数截断

来自分类Dev

如果它的键可以有多个值,如何从dict中获取值

来自分类Dev

动态地在dict中设置一个值

来自分类Dev

MYSQL:如果columnB = $ value,则将columnA更新为1

来自分类Dev

设置一个节点以接替同一父节点下的特定节点

来自分类Dev

如何像使用num_to_word_dict(如果存在)一样通过其键访问值?

来自分类Dev

在python的叶子节点中检查嵌套的dict是否为False

来自分类Dev

Pentaho-如果按条件最小日期时间组,则将另一个字段值设置为 value1

来自分类Dev

如果 dict key[0][value] 中的行得到 key[1][value]

Related 相关文章

  1. 1

    如果Dict值为null

  2. 2

    Sort a dict by its value pairs

  3. 3

    我需要一个polyfill用于objectify.SubElement

  4. 4

    如何在ElementTree(Python)中向SubElement添加属性

  5. 5

    如何像使用num_to_word_dict(如果存在)一样通过其键访问值?

  6. 6

    如果模拟dict,在python中为__getitem __()子类化对象的正确方法

  7. 7

    python json dict迭代{key:value}是相同的

  8. 8

    如果Python dict理解覆盖键,则会引发错误

  9. 9

    PHP,如果变量isset设置id为value1,否则设置为value2

  10. 10

    如果存在,如何比较Dict 1中键值的值为“ ==”或“!=”

  11. 11

    ShinyTree:如果选中复选框,则将变量设置为value

  12. 12

    检索密钥从熊猫设置一系列的dict值

  13. 13

    MongoDB值在python中为Dict

  14. 14

    如果x在dict.iterkey()中,则y是dict.value

  15. 15

    使用ElementTree将新的SubElement添加到现有XML文件中

  16. 16

    在dict中搜索列表以获取值(如果找到)返回dict标识符

  17. 17

    在getter方法中为dict赋值

  18. 18

    如果子字符串匹配dict键,则用dict值替换子字符串?

  19. 19

    将dict值设置为自身会创建无限副本

  20. 20

    大熊猫:如果其他列的任何子组中的value = yes,则将列的值设置为true

  21. 21

    document.getElementById()。value如果为0,则将秒数截断

  22. 22

    如果它的键可以有多个值,如何从dict中获取值

  23. 23

    动态地在dict中设置一个值

  24. 24

    MYSQL:如果columnB = $ value,则将columnA更新为1

  25. 25

    设置一个节点以接替同一父节点下的特定节点

  26. 26

    如何像使用num_to_word_dict(如果存在)一样通过其键访问值?

  27. 27

    在python的叶子节点中检查嵌套的dict是否为False

  28. 28

    Pentaho-如果按条件最小日期时间组,则将另一个字段值设置为 value1

  29. 29

    如果 dict key[0][value] 中的行得到 key[1][value]

热门标签

归档