使用etree追加多个元素,如何在新行上编写每个元素?

时间:2016-10-17 11:47:48

标签: python xml elementtree graphml

我使用Python和etree将一些元素添加到graphml文件中的某些节点。我有两个字符串列表,其中包含一些我想写入.graphml文件的数据。我已设法做到这一点,但在使用.append()函数时,它会在同一行上写入两个新元素。在同一个循环中编写这些新元素时,是否有一种很好的方法可以将这些新元素分开?

我有以下数据集:

<?xml version="1.0" encoding="UTF-8"?>
<graphml xmlns="http://graphml.graphdrawing.org/xmlns">
  <node id="node1">
    <data key="label">node1</data>
    <data key="degree">6</data>
  </node>
  <node id="node2">
    <data key="label">node2</data>
    <data key="degree">32</data>
  </node>
  <node id="node3">
    <data key="label">node3</data>
    <data key="degree">25</data>
  </node>
</graphml>

和两个包含年份的列表:

lastActive["2013","2014","2015"]
lastRelated["2012","2014","2011"]

使用以下代码将列表附加为数据集中的元素:

for node in root:

    #checks if correct node
    for index, i in enumerate(nameOfNode):
        if i == node[0].text:

            #create and add lastRelated element
            lastRelated = Element('data')
            lastRelated.set('key', 'lastRelated')
            node.append(lastRelated)
            lastRelated.text = lastRelated[index]

            #create and add lastActive element
            lastActive = Element('data')
            lastActive.set('key', 'lastActive')
            node.append(lastActive)
            lastActive.text = lastActive[index]

            updatedText = etree.tostring(node)

            #write to file
            file = open('dataset.graphml', 'wb')
            file.write(updatedText)
            file.close()

以下结果是:

  <node id="node1">
  <data key="label">node1</data>
  <data key="degree">6</data>
  <data key="lastActive">2015</data><data key="lastRelated">2011</data></node>

我希望它的结构为:

  <node id="node1">
  <data key="label">node1</data>
  <data key="degree">6</data>
  <data key="lastActive">2015</data>
  <data key="lastRelated">2011</data>
  </node>

任何人都有解决方案吗?

1 个答案:

答案 0 :(得分:1)

您应该能够通过为新元素的tail属性提供合适的值来获取所需的输出。 tail是位于元素结束标记之后和后续元素的开始标记之前的文本。

...

thetail = "\n  "
lastRelated.tail = thetail
lastActive.tail = thetail

updatedText = etree.tostring(node)

...