使用 LXML 将 XML 写入文件
Writing XML to file using LXML
我正在尝试使用 LXML 创建一个 XML 文件。到目前为止我有...
from lxml import etree
def exportAsXML(self, filename):
fields = [
('Realm', self.Realm),
('ActiveState', self.ActiveState),
('Name', self.Name),
('Type', self.Type),
('Level', self.Level),
('Quality', self.Quality),
('Bonus', self.Bonus),
('AFDPS', self.AFDPS),
('Speed', self.Speed),
('Origin', self.Origin),
('DamageType', self.DamageType),
('LeftHand', self.LeftHand),
('Requirement', self.Requirement),
('Notes', self.Notes,)
]
root = etree.Element('Item')
for key, value in fields:
if value != '':
etree.SubElement(root, key).text = value
document = open(filename, 'w')
document.write(etree.tostring(root, pretty_print = True))
document.close()
结果是 TypeError: must be str, not bytes
,但我不明白发生了什么。我假设通过使用 etree.tostring
将 etree 对象转换为字符串,但事实并非如此。有什么想法吗?
** 更新 **
我想做的是创建一个有效的 XML 文件,该文件使用 LXML 整齐地格式化并包含 DTD(尚未实现)。我已经在我的应用程序的其他领域使用了 LXML,所以我想我会继续使用它。我正在使用 Python 3.
** 更新 2 **
console
b'<Item><Realm>All</Realm><ActiveState>Dropped</ActiveState><Name>Band</Name><Type>Wrist</Type><Level>50</Level><Quality>100</Quality><Bonus>35</Bonus><Origin>Quest</Origin></Item>'
file
<Item><Realm>All</Realm><ActiveState>Dropped</ActiveState><Name>Band</Name><Type>Wrist</Type><Level>50</Level><Quality>100</Quality><Bonus>35</Bonus><Origin>Quest</Origin></Item>
对于 XML 文件,只需在 open()
中使用 'wb'
参数并考虑上下文管理器,with
:
with open(filename, 'wb') as doc:
doc.write(etree.tostring(root, pretty_print = True))
作为演示,下面测试 OP 的例程,对 self 变量进行轻微更改,并以漂亮的打印格式输出:
def exportAsXML(filename):
fields = [
('Realm', 'self.Realm'),
('ActiveState', 'self.ActiveState'),
('Name', 'self.Name'),
('Type', 'self.Type'),
('Level', 'self.Level'),
('Quality', 'self.Quality'),
('Bonus', 'self.Bonus'),
('AFDPS', 'self.AFDPS'),
('Speed', 'self.Speed'),
('Origin', 'self.Origin'),
('DamageType', 'self.DamageType'),
('LeftHand', 'self.LeftHand'),
('Requirement', 'self.Requirement'),
('Notes', 'self.Notes')
]
root = etree.Element('Item')
for key, value in fields:
if value != '':
etree.SubElement(root, key).text = value
with open(filename, 'wb') as doc:
doc.write(etree.tostring(root, pretty_print = True))
exportAsXML('Output.xml')
输出
<Item>
<Realm>self.Realm</Realm>
<ActiveState>self.ActiveState</ActiveState>
<Name>self.Name</Name>
<Type>self.Type</Type>
<Level>self.Level</Level>
<Quality>self.Quality</Quality>
<Bonus>self.Bonus</Bonus>
<AFDPS>self.AFDPS</AFDPS>
<Speed>self.Speed</Speed>
<Origin>self.Origin</Origin>
<DamageType>self.DamageType</DamageType>
<LeftHand>self.LeftHand</LeftHand>
<Requirement>self.Requirement</Requirement>
<Notes>self.Notes</Notes>
</Item>
我正在尝试使用 LXML 创建一个 XML 文件。到目前为止我有...
from lxml import etree
def exportAsXML(self, filename):
fields = [
('Realm', self.Realm),
('ActiveState', self.ActiveState),
('Name', self.Name),
('Type', self.Type),
('Level', self.Level),
('Quality', self.Quality),
('Bonus', self.Bonus),
('AFDPS', self.AFDPS),
('Speed', self.Speed),
('Origin', self.Origin),
('DamageType', self.DamageType),
('LeftHand', self.LeftHand),
('Requirement', self.Requirement),
('Notes', self.Notes,)
]
root = etree.Element('Item')
for key, value in fields:
if value != '':
etree.SubElement(root, key).text = value
document = open(filename, 'w')
document.write(etree.tostring(root, pretty_print = True))
document.close()
结果是 TypeError: must be str, not bytes
,但我不明白发生了什么。我假设通过使用 etree.tostring
将 etree 对象转换为字符串,但事实并非如此。有什么想法吗?
** 更新 **
我想做的是创建一个有效的 XML 文件,该文件使用 LXML 整齐地格式化并包含 DTD(尚未实现)。我已经在我的应用程序的其他领域使用了 LXML,所以我想我会继续使用它。我正在使用 Python 3.
** 更新 2 **
console
b'<Item><Realm>All</Realm><ActiveState>Dropped</ActiveState><Name>Band</Name><Type>Wrist</Type><Level>50</Level><Quality>100</Quality><Bonus>35</Bonus><Origin>Quest</Origin></Item>'
file
<Item><Realm>All</Realm><ActiveState>Dropped</ActiveState><Name>Band</Name><Type>Wrist</Type><Level>50</Level><Quality>100</Quality><Bonus>35</Bonus><Origin>Quest</Origin></Item>
对于 XML 文件,只需在 open()
中使用 'wb'
参数并考虑上下文管理器,with
:
with open(filename, 'wb') as doc:
doc.write(etree.tostring(root, pretty_print = True))
作为演示,下面测试 OP 的例程,对 self 变量进行轻微更改,并以漂亮的打印格式输出:
def exportAsXML(filename):
fields = [
('Realm', 'self.Realm'),
('ActiveState', 'self.ActiveState'),
('Name', 'self.Name'),
('Type', 'self.Type'),
('Level', 'self.Level'),
('Quality', 'self.Quality'),
('Bonus', 'self.Bonus'),
('AFDPS', 'self.AFDPS'),
('Speed', 'self.Speed'),
('Origin', 'self.Origin'),
('DamageType', 'self.DamageType'),
('LeftHand', 'self.LeftHand'),
('Requirement', 'self.Requirement'),
('Notes', 'self.Notes')
]
root = etree.Element('Item')
for key, value in fields:
if value != '':
etree.SubElement(root, key).text = value
with open(filename, 'wb') as doc:
doc.write(etree.tostring(root, pretty_print = True))
exportAsXML('Output.xml')
输出
<Item>
<Realm>self.Realm</Realm>
<ActiveState>self.ActiveState</ActiveState>
<Name>self.Name</Name>
<Type>self.Type</Type>
<Level>self.Level</Level>
<Quality>self.Quality</Quality>
<Bonus>self.Bonus</Bonus>
<AFDPS>self.AFDPS</AFDPS>
<Speed>self.Speed</Speed>
<Origin>self.Origin</Origin>
<DamageType>self.DamageType</DamageType>
<LeftHand>self.LeftHand</LeftHand>
<Requirement>self.Requirement</Requirement>
<Notes>self.Notes</Notes>
</Item>