2011-05-30 63 views
1

添加一行XML我从保留的扑救,但要覆盖输出文件每当我创建的XmlReportGenerator使用LXML

from lxml import etree 
from Flights.FlightTravelReservation import FlightTravelReservation 

class XmlReportGenerator: 
    root = None 
    doc = None 

    def __init__(self): 
     self.root = etree.Element('results') 
     self.doc = etree.ElementTree(self.root) 

    def add_flight_row(self, flight_travel_reservation): 
     page_element = etree.SubElement(self.root, 'FlightTravel') 
     etree.SubElement(page_element, 'QuantityOfPassengers').text = 
      str(len(flight_travel_reservation.paxes)) 
     etree.SubElement(page_element,'Id').text = 
      flight_travel_reservation.reservation_id 

    def Save(self, path = 'Flights.xml'): 
     outFile = open(path, 'wb') 
     self.doc.write(outFile) 

一个新的实例,其中样本输出时间的方法:

<results> 
    <FlightTravel> 
    <Paxes>4</Paxes> 
    <Id>259183</Id> 
    </FlightTravel> 
</results> 

如何修改add_flight_row方法来添加新行?例如,我想是这样的:

<results> 
    <FlightTravel> 
    <Paxes>4</Paxes> 
    <Id>259183</Id> 
    </FlightTravel> 
    <FlightTravel> 
    <Paxes>9</Paxes> 
    <Id>123456</Id> 
    </FlightTravel> 
</results> 

我加入的测试方法:

def test_test(self,a,b): 

    page_element = etree.SubElement(self.root,'FlightTravel') 

    etree.SubElement(page_element,'QuantityOfPassengers').text = a 
    etree.SubElement(page_element,'Id').text = b 

    return page_element 

这是我如何使用它:

x=XmlReportGenerator() 
x.test_test("a","b") 
x.Save("test.xml") 

x=XmlReportGenerator() 
x.test_test("c","d") 
x.Save("test.xml") 

和结果,我有:

<results> 
    <FlightTravel> 
    <Flights/> 
    <QuantityOfPassengers>c</QuantityOfPassengers> 
    <Id>d</Id> 
    </FlightTravel> 
</results> 

而不是

<results> 
    <FlightTravel> 
    <Flights/> 
    <QuantityOfPassengers>a</QuantityOfPassengers> 
    <Id>b</Id> 
    </FlightTravel> 
    <FlightTravel> 
    <Flights/> 
    <QuantityOfPassengers>c</QuantityOfPassengers> 
    <Id>d</Id> 
    </FlightTravel> 
</results> 
+0

你有没有良好的XML在您的两个例子。 – Jacob 2011-05-30 09:58:16

+0

不,我可以用IE打开它,所以没关系。有一个节点飞行,但不要看它。现在它不重要:) – user278618 2011-05-30 10:11:12

+0

既然你没有显示调用'add_flight_row'的代码,那么我猜''''''''每个'flight_travel_reservation'的每个元素都会'保存'每个'results'树,或者根本就没有循环。代码与输出不匹配,因此请粘贴实际的代码和输出。 – msw 2011-05-30 11:07:32

回答

2

你需要定义一个Load功能XmlReportGenerator加载旧的结果。

class XmlReportGenerator(object): 
    def __init__(self): 
    # __init__, add_flight_row, and Save 

    def load(self, path='Flights.xml'): 
     try: 
      self.doc = etree.ElementTree() 
      self.root = self.doc.parse(path) 
     except IOError: 
      pass 

,并使用它像这样:

# day 1 
x=XmlReportGenerator() 
x.load('test.xml') # Silently catches the error if the file does not exit yet 
x.test_test("a","b") 
x.Save('test.xml') 

# day2 
x=XmlReportGenerator() 
x.load('test.xml') 
x.test_test("c","d") 
x.Save("test.xml") 
+0

所以我不能?我将每天运行此代码,因此没有机会使用XmlReportGenerator的同一个实例 – user278618 2011-05-30 12:13:38

+0

@ user278618对不起,我没有意识到您想将'cd'附加到'ab'文件,而不仅仅是创建带有'abcd'的文件。 – phihag 2011-05-30 12:18:49

+0

@ user278618已更新。这是你的想法吗? – phihag 2011-05-30 12:27:09

0

只需拨打add_flight_row(或test_test)反复在同一实例为您要添加的每一行:

x = XmlReportGenerator() 
x.test_test("a", "b") 
x.test_test("c", "d") 
x.Save("test.xml") 
+0

所以我不能?我会每天运行这个代码,所以没有机会使用XmlReportGenerator的同一个实例 – user278618 2011-05-30 12:13:49