2012-05-24 61 views
3

我在XML序列化方面存在問題。我會嘗試用下面的示例XML文件僅序列化xml文件的一部分並保存它

<AutoExpo> 
    <Details> 
    <Venue>XYZ</Venue> 
    <StartTime>09:00</StartTime> 
    <EndTime>21:00</EndTime> 
    </Details> 

    <Cars> 
     <Car> 
     <Company>Chevrolet</Company> 
     <Model>Cruz</Model> 
     <Color>Red</Color> 
     </Car> 

     <Car> 
     <Company>Ford</Company> 
     <Model>Fiesta</Model> 
     <Color>Blue</Color> 
     </Car> 

    </Cars> 
</AutoExpo> 

解釋它現在,當我讀到這個xml文件,我反序列化汽車進入的對象。汽車列表可能很大。我的代碼使用這個對象,可以改變一些汽車的屬性。現在,如果我只想將其屬性已更改的汽車對象序列化回xml文件並保存,以便下次啓動代碼時獲取最新的狀態信息。

回答

0

儘管它可能不是最好的解決方案,但一個潛在的可行選擇是將編輯的列表序列化爲單獨的文件,並在代碼中比較這兩個文件。如果信息沒有任何變化,則兩個文本文件應該相同。如果不是,您可以用新文件替換舊文件。最簡單的方法是,而不是序列化到一個文件並讀取/寫入,也許將它發送到一個流並進行比較。

0

當您序列化一個對象時,它會生成整個XML文檔。所以,如果將其保存到文件中,它將覆蓋文件的以前的內容。因此,如果您希望生成的文件包含所有汽車,包括但不限於修改的汽車,則需要序列化整個汽車。如果你只序列化了那些改變了的文件,那麼文件就會失去所有沒有改變的汽車。如果你真的只想序列化已更改的汽車,我會建議創建一個AutoExpo對象的新實例,並且只插入要保存的汽車,然後僅用部分列表序列化該對象。

如果您需要修改XML中的單個元素而不觸及其餘部分,因爲數據太大,XML不是一個好的選擇。我會建議一個關係數據庫。或者,您可以將每輛車存儲爲自己的XML文件,並且只根據需要單獨加載和保存每輛車。

0

你不能用XML來做到這一點。考慮使用關係數據庫。關係數據庫有一個內置的文件空間管理機制,可以根據你的需要進行操作。您可以更新單個記錄,添加和刪除記錄。

Jet .mdb數據庫(Access)是替代XML文件的理想選擇。您可以通過OLEDB訪問它,限制爲應用程序必須編譯爲32位。訪問不需要安裝。

1

在這裏或那裏改變屬性的XML文件中跳轉將是相當困難的,無論它們在哪裏更改。你應該把整個文件讀入內存,當你保存時,寫出整個文件,覆蓋舊文件。

XML並不是一個可怕的方式,但據我所知,SQL Server(或其他RDBMS)數據庫會更合適。您不必擔心這樣的問題,因爲數據庫引擎會爲您做到這一點。

0

首先,您的實體必須具有唯一的標識符。現在

<AutoExpo> 
    <Details> 
    <Venue>XYZ</Venue> 
    <StartTime>09:00</StartTime> 
    <EndTime>21:00</EndTime> 
    </Details> 

    <Cars> 
    <Car id="1"> 
     <Company>Chevrolet</Company> 
     <Model>Cruz</Model> 
     <Color>Red</Color> 
    </Car> 
    <Car id="2"> 
     <Company>Ford</Company> 
     <Model>Fiesta</Model> 
     <Color>Blue</Color> 
    </Car> 
    </Cars> 
</AutoExpo> 

你可以使用XPath來選擇那些需要更新和更改其內容的節點。

  1. 將文檔裝入一個XDocument
  2. 找車:document.Element( 「汽車[ID = 2]」)
  3. 設置新值:element.Element( 「顏色」)。值=「黑色」

但是,使用基於文件的存儲的缺點仍然存在。您仍然需要將整個文件加載到內存中,並在更新時將其寫回硬盤驅動器,但不必序列化所有Car對象。 我想不出一種簡單的方法來將文件從硬盤中流式傳輸並一次處理。

+0

另一種解決方案可能是將更改保存到一個文件中並立即創建快照。事實上,您必須解析多個文件(最新的快照和所有更改)才能「打開」您的數據庫。 PS:正如其他人所建議的,看一看關係數據庫,或者可能在基於XML的數據庫中,這可能有助於遷移數據。 –

相關問題