2011-05-30 64 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