簡體   English   中英

使用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 **

安慰

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>'

文件

<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文件,只需使用'wb'在爭論中open()並考慮上下文管理器, with

with open(filename, 'wb') as doc:
   doc.write(etree.tostring(root, pretty_print = True))

作為演示,下面測試了OP的例程,對變量進行了些微更改,並以漂亮的打印格式輸出:

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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM