Python的ElementTree的序列化错误写入磁盘
问题描述:
当我解析在pythonPython的ElementTree的序列化错误写入磁盘
tree = ET.parse('existing.xml')
添加一个文件在内存中的一些XML元素到XML结构
NodeList = tree.findall(".//NodeList")
NodeList_WeWant = buildingNodeList[0]
for member in aList:
ET.SubElement(NodeList_WeWant,member)
写回磁盘
tree.write("output.sbp", encoding="utf-16")
但我得到
Traceback (most recent call last):
File "runonreal.py", line 156, in <module>
tree.write("output.sbp", encoding="utf-16")
File "C:\Python340\lib\xml\etree\ElementTree.py", line 775, in write
qnames, namespaces = _namespaces(self._root, default_namespace)
File "C:\Python340\lib\xml\etree\ElementTree.py", line 887, in _namespaces
_raise_serialization_error(tag)
File "C:\Python340\lib\xml\etree\ElementTree.py", line 1059, in _raise_serialization_error
"cannot serialize %r (type %s)" % (text, type(text).__name__)
TypeError: cannot serialize <Element 'BuildingNodeBase' at 0x099421B0> (type Element)
编辑。错误的简单复制。见下面
我的基本XML
<?xml version="1.0" encoding="UTF-8"?>
<family>
<person>
<id>100</id>
<name>Shorn</name>
<height>5.8</height>
</person>
<person>
<id>101</id>
</person>
</family>
的Python脚本
import xml.etree.ElementTree as ET
from copy import deepcopy
tree = ET.parse('basic.xml')
root = tree.getroot()
cloneFrom = tree.findall(".//person[name='Shorn']")
cloneTo = tree.findall(".//person[id='101']")
cloneTo = deepcopy(cloneFrom)
ET.SubElement(root,cloneTo)
tree.write("output.xml", encoding="utf-16")
,这是我期待的Output.xml。应将个人节点克隆到另一个人节点并写回磁盘。
<?xml version="1.0" encoding="UTF-16"?>
<family>
<person>
<id>100</id>
<name>Shorn</name>
<height>5.8</height>
</person>
<person>
<id>100</id>
<name>Shorn</name>
<height>5.8</height>
</person>
</family>
答
这里有一些问题:
-
findall()
返回一个列表,而不是一个单一的元素。 -
SubElement
需要一个字符串,而不是一个Element
对象,作为第二个参数。 - id ='101'的元素不会被删除。
这里是代码为我的作品(与Python 3.6.1测试):
import xml.etree.ElementTree as ET
from copy import deepcopy
tree = ET.parse('basic.xml')
root = tree.getroot()
remove = tree.find(".//person[id='101']")
cloneFrom = tree.find(".//person[name='Shorn']")
root.remove(remove)
root.append(deepcopy(cloneFrom))
tree.write("output.xml", encoding="utf-16")
这是与Output.xml的样子:
<?xml version='1.0' encoding='utf-16'?>
<family>
<person>
<id>100</id>
<name>Shorn</name>
<height>5.8</height>
</person>
<person>
<id>100</id>
<name>Shorn</name>
<height>5.8</height>
</person>
</family>