解析XML文件-options?

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要容易得多.好吧,学习曲线陡峭,但值得.

谢谢!

Gra*_*ark 6

如果您的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=''似乎不对).