我正在開發一個系統,通過Exchange Web服務從電子郵件中提取XML附件,並通過我創建的自定義DAL對象將它們輸入到數據庫中。解析XML文件-options?
我已經設法提取XML附件並將其準備好作爲流...他們的問題是如何解析此流並填充DAL對象。
我可以創建一個XMLTextReader並遍歷每個元素。除此之外,我沒有看到任何問題,我懷疑有一種很滑的方式。閱讀器似乎將開始標籤,標籤的內容和結束標籤視爲不同的元素(使用reader.NodeType)。我預計我的價值被認爲是一個元素而不是三個。就像我說的,我可以解決這個問題,但我相信肯定有更好的方法。
我遇到了使用XML序列化器(對我來說是全新的)的想法,但快速查看錶明這些不能處理ArrayLists和List(我正在使用List)。
再一次,我是LINQ的新手,但也提到了LINQ到XML,但我看過的例子看起來相當複雜 - 儘管我只是缺乏熟悉感。
基本上,我不想要一個封閉的系統,但我不想使用任何複雜的技術與學習曲線,只是因爲它'很酷'。
將此XML/Stream轉換爲我的DAL對象的最簡單和最有效的方法是什麼?
XML示例:
<?xml version="1.0" encoding="UTF-8"?>
<enquiry>
<enquiryno>100001</enquiryno>
<companyname>myco</companyname>
<typeofbusiness>dunno</typeofbusiness>
<companyregno>ABC123</companyregno>
<postcode>12345</postcode>
<contactemail>[email protected]</contactemail>
<firstname>My</firstname>
<lastname>Name</lastname>
<vehicles>
<vehicle>
<vehiclereg>54321</vehiclereg>
<vehicletype>Car</vehicletype>
<vehiclemake>Ford</vehiclemake>
<cabtype>n/a</cabtype>
<powerbhp>130</powerbhp>
<registrationdate>01/01/2003</registrationdate>
</vehicle>
</vehicles>
</enquiry>
更新1: 我試圖反序列化的基礎上,格雷厄姆的例子。我認爲我已經設置了序列化的DAL,包括爲每個屬性指定[XmlElement("whatever")]
。我已經嘗試使用反序列化如下:
SalesEnquiry enquiry = null;
XmlSerializer serializer = new XmlSerializer(typeof(SalesEnquiry));
enquiry = (SalesEnquiry)serializer.Deserialize(stream);
但是,我得到一個異常:「There is an error in XML document (2, 2)
」。設置InnerException指出{"<enquiry xmlns=''> was not expected."}
結論(更新):
我以前的問題是一個事實,即XML文件(查詢)中的元素=類(SalesEnquiry)這個名字!而不是該類的[XmlElement]
屬性,我們需要改爲[XmlRoot]
屬性。爲了完整起見,如果您希望在序列化過程中忽略班級中的某個屬性,請使用[XmlIgnore]
屬性。
我已成功序列化了我的對象,並且現在已成功接收傳入的XML並將其解序列化爲SalesEnquiry對象。
這種方法比手動解析XML要容易得多。好吧,學習曲線陡峭,但是值得。
謝謝!
XML附件是否符合特定模式?它總是一樣的模式?您是否將XML「分解」爲特定的表格佈局,或將整個文檔存儲爲BLOB? – lesscode 2010-07-27 11:51:41
@Wayne:不,沒有正式的模式,一些元素是可選的,將會丟失而不是空白。數據存儲在數據庫中的一對錶中。 – CJM 2010-07-27 13:46:49
我已根據您的更新更新了我的答案。 – 2010-07-27 14:44:18