2013-10-07 70 views
0

我正在尋找一種快速高效的方式從多個xml文件中檢索2個字符串。從多個XML文件中讀取兩個節點的最有效方法?

他們自己的文件不是那麼大,只有50kb到100kb,文件數量可以從無到100.我包含了一個我將使用的非常小的xml文件的樣本。所有的XML文件將是相同的格式,這裏只有兩件事情,我需要從即所有文件知道:

<Company>test bv.</Company> 
    <Ship>sss testing</Ship> 

我想存儲在一個結構/類這些字符串,因爲我不能在.NET 3.5使用元組(或者我誤會了?)

所以問題:這樣做的最有效的方法是什麼?使用Xdocument?使用xmlReader?或者是其他東西?

<?xml version="1.0" encoding="utf-8"?> 
<Collection xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Customer> 
    <ID>-1</ID> 
    <Updated>true</Updated> 
    <Company>test bv.</Company> 
    <Ship>sss testing</Ship> 
    <Adress>fggfgggff gvg</Adress> 
    <City>fgcgg</City> 
    <ZipCode>5454fc</ZipCode> 
    <Country>fcgggff</Country> 
    <BTW_Nmbr>55</BTW_Nmbr> 
    <IsTempCustomer>true</IsTempCustomer> 
    <PhoneNumbers> 
     <ContactData> 
     <ID>21</ID> 
     <Updated>true</Updated> 
     <Description>455656567</Description> 
     <Name>ghbbvh</Name> 
     <IsSendable>false</IsSendable> 
     </ContactData> 
     <ContactData> 
     <ID>22</ID> 
     <Updated>true</Updated> 
     <Description>2315098234146124302134</Description> 
     <Name>asdfawegaebf</Name> 
     <IsSendable>false</IsSendable> 
     </ContactData> 
    </PhoneNumbers> 
    <EmailAdresses /> 
    </Customer> 
    <Order> 
    <ID>-1</ID> 
    <Updated>true</Updated> 
    <OrderNr>10330200</OrderNr> 
    <OrderDate>1-1-2005</OrderDate> 
    <StartDate>10-9-2013</StartDate> 
    <ExpirationDate>20-10-2013</ExpirationDate> 
    <Executor>Andre de Zwart</Executor> 
    <Executors /> 
    <Reference /> 
    <OrderDetail /> 
    <IsDigital>true</IsDigital> 
    </Order> 
    <Materials> 
    <MaterialData> 
     <ID>108</ID> 
     <Updated>true</Updated> 
     <Description>ffdffggfg</Description> 
     <Amount>34</Amount> 
    </MaterialData> 
    <MaterialData> 
     <ID>109</ID> 
     <Updated>true</Updated> 
     <Description>ffccff</Description> 
     <Amount>45</Amount> 
    </MaterialData> 
    </Materials> 
    <HourExpenses> 
    <HourExpensesData> 
     <ID>43850</ID> 
     <Updated>true</Updated> 
     <Date>2013-10-06T00:00:00</Date> 
     <Notes>lala</Notes> 
     <Day>Sunday</Day> 
     <Hours>0.01</Hours> 
     <BusinessHours>0.01</BusinessHours> 
     <TravledHoursTo>0</TravledHoursTo> 
     <TravledHoursFrom>0</TravledHoursFrom> 
     <Start>2013-10-06T12:27:00</Start> 
     <Stop>2013-10-06T12:27:00</Stop> 
    </HourExpensesData> 
    <HourExpensesData> 
     <ID>43849</ID> 
     <Updated>true</Updated> 
     <Date>2013-09-17T00:00:00</Date> 
     <Notes>oke dus ik ben nu lekker aan het werk en ik typ wat spul er bij</Notes> 
     <Day>Tuesday</Day> 
     <Hours>0</Hours> 
     <BusinessHours>0.01</BusinessHours> 
     <TravledHoursTo>0</TravledHoursTo> 
     <TravledHoursFrom>0</TravledHoursFrom> 
     <Start>2013-09-17T12:31:31</Start> 
     <Stop>2013-09-17T12:31:32</Stop> 
    </HourExpensesData> 
    <HourExpensesData> 
     <ID>43855</ID> 
     <Updated>true</Updated> 
     <Date>2013-10-03T00:00:00</Date> 
     <Notes>test</Notes> 
     <Day>Thursday</Day> 
     <Hours>0</Hours> 
     <BusinessHours>0</BusinessHours> 
     <TravledHoursTo>12</TravledHoursTo> 
     <TravledHoursFrom>12</TravledHoursFrom> 
     <Start>0001-01-01T00:00:00</Start> 
     <Stop>0001-01-01T00:00:00</Stop> 
    </HourExpensesData> 
    </HourExpenses> 
    <TravelExpenses> 
    <TravelExpensesData> 
     <ID>672</ID> 
     <Updated>true</Updated> 
     <Date>2013-09-27T00:00:00</Date> 
     <Notes /> 
     <KmTo>45</KmTo> 
     <KmFrom>45</KmFrom> 
     <Declaration>0</Declaration> 
    </TravelExpensesData> 
    </TravelExpenses> 
    <Signatures> 
    <ID>-1</ID> 
    <Updated>true</Updated> 
    <OrderID>10330200</OrderID> 
    <Completed>false</Completed> 
    <Notes>yay het werkt ;D</Notes> 
    </Signatures> 
    <RemovedDataList /> 
</Collection> 

回答

3

我只想用的LINQ to XML中最簡單的方式:

var query = from file in files 
      let doc = XDocument.Load(file) 
      from customer in doc.Descendants("Customer") 
      select new { 
       Company = (string) customer.Element("Company"), 
       Ship = (string) customer.Element("Ship") 
      }; 

我期望這是相當快,已經 - 但你應該找出你的具體的性能要求是什麼,然後測試它們。 (你幾乎肯定不需要「最高效」的方式 - 你需要一個有效的方式,同時保持代碼的可讀性。)

請注意,如果你想要傳播的值超出當前的方法,你應該創建自己的班級來代表公司/船對。

+0

你是對的@Jon Skeet足夠有效的方式會做。我不得不承認我忘了linq(沒有意識到我可以用它),這真的很酷 – Vincent

相關問題