CJM*_*CJM 1 c# xml serialization parsing xml-serialization
我正在开发一个系统,通过Exchange Web服务从电子邮件中获取XML附件,并通过我创建的自定义DAL对象将它们输入到数据库中.
我已经设法提取XML附件并将其作为流准备好......他们的问题是如何解析此流并填充DAL对象.
我可以创建一个XMLTextReader并遍历每个元素.我没有看到任何问题,除了我怀疑有一个更光滑的方式.读者似乎将开始标记,标记内容和结束标记视为不同的元素(使用reader.NodeType).我希望myValue被认为是一个元素而不是三个元素.就像我说的,我可以解决这个问题,但我确信必须有更好的方法.
我遇到了使用XML Serializer(对我来说是全新的)的想法,但快速查看表明这些无法处理ArrayLists和List(我正在使用List).
同样,我是LINQ的新手,但也提到了LINQ-to-XML,但我看到的例子似乎相当复杂 - 尽管我只是缺乏熟悉感.
基本上,我不想要一个cludged系统,但我不想使用任何复杂的技术与学习曲线,只是因为它是'酷'.
将此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>me@example.com</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>
Run Code Online (Sandbox Code Playgroud)
更新1:我正在尝试反序列化,基于格雷厄姆的例子.我想我已经为序列化设置了DAL,包括[XmlElement("whatever")]为每个属性指定.我尝试使用以下方法反序列化:
SalesEnquiry enquiry = null;
XmlSerializer serializer = new XmlSerializer(typeof(SalesEnquiry));
enquiry = (SalesEnquiry)serializer.Deserialize(stream);
Run Code Online (Sandbox Code Playgroud)
但是,我得到一个例外:' There is an error in XML document (2, 2)'.不良情绪表明{"<enquiry xmlns=''> was not expected."}
结论(更新):
我之前的问题是XML文件中的元素(查询)!=类的名称(SalesEnquiry).而不是一个[XmlElement]class属性,我们需要一个[XmlRoot]替代属性.为了完整性,如果希望在序列化期间忽略类中的[XmlIgnore]属性,则使用该属性.
我已成功序列化了我的对象,现在已成功获取传入的XML并将其反序列化为SalesEnquiry对象.
这种方法比手动解析XML要容易得多.好吧,学习曲线陡峭,但值得.
谢谢!
如果您的XML使用模式(即您总是会知道哪些元素出现以及它们在树中出现的位置),您可以使用它XmlSerializer来创建对象.您只需要在类上使用一些属性来告诉序列化程序它们对应的XML元素或属性.然后,您只需加载XML,XmlSerializer使用您要创建的.NET对象的类型创建一个新的,然后调用该Deserialize方法.
例如,你有一个这样的类:
[Serializable]
public class Person
{
[XmlElement("PersonName")]
public string Name { get; set; }
[XmlElement("PersonAge")]
public int Age { get; set; }
[XmlArrayItem("Child")]
public List<string> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
并输入这样的XML(保存在本例中的文件中):
<?xml version="1.0"?>
<Person>
<PersonName>Bob</PersonName>
<PersonAge>35</PersonAge>
<Children>
<Child>Chris</Child>
<Child>Alice</Child>
</Children>
</Person>
Run Code Online (Sandbox Code Playgroud)
然后你创建一个Person像这样的实例:
Person person = null;
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (FileStream fs = new FileStream(GetFileName(), FileMode.Open))
{
person = (Person)serializer.Deserialize(fs);
}
Run Code Online (Sandbox Code Playgroud)
更新:
基于您的上一次更新,我猜你要么需要XmlRoot在作为根元素的类上指定一个属性(即SalesEnquiry),要么XmlSerializer在XML中引用一个空名称空间可能有点困惑(xmlns=''似乎不对).
| 归档时间: |
|
| 查看次数: |
835 次 |
| 最近记录: |