我正在开发一个系统,通过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