C# 解析XML文件-选项?
我正在开发一个系统,通过ExchangeWeb服务从电子邮件中提取XML附件,并通过我创建的自定义DAL对象将其输入数据库 我已设法提取XML附件并将其作为流准备好。。。他们的问题是如何解析这个流并填充DAL对象 我可以创建一个XMLTextReader并遍历每个元素。我不认为这有什么问题,除了我怀疑有一个更巧妙的方法。阅读器似乎将开始标记、标记内容和结束标记视为不同的元素(使用reader.NodeType)。我希望myValue被视为一个元素,而不是三个元素。就像我说的,我可以绕过这个问题,但我相信一定有更好的办法 我想到了使用XML序列化程序(对我来说是全新的)的想法,但快速浏览一下就发现它们无法处理ArrayList和List(我使用的是List) 同样,我对LINQ还不熟悉,但也提到了LINQ到XML,但我看到的示例似乎相当复杂——尽管这只是因为我不熟悉 基本上,我不想要一个棍棒系统,但我不想使用任何复杂的技术和学习曲线,仅仅因为它“酷” 将此XML/流转换为我的DAL对象的最简单和最有效的方法是什么 XML示例:C# 解析XML文件-选项?,c#,xml,parsing,serialization,xml-serialization,C#,Xml,Parsing,Serialization,Xml Serialization,我正在开发一个系统,通过ExchangeWeb服务从电子邮件中提取XML附件,并通过我创建的自定义DAL对象将其输入数据库 我已设法提取XML附件并将其作为流准备好。。。他们的问题是如何解析这个流并填充DAL对象 我可以创建一个XMLTextReader并遍历每个元素。我不认为这有什么问题,除了我怀疑有一个更巧妙的方法。阅读器似乎将开始标记、标记内容和结束标记视为不同的元素(使用reader.NodeType)。我希望myValue被视为一个元素,而不是三个元素。就像我说的,我可以绕过这个问题,
<?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>
但是,我得到一个例外:“XML文档(2,2)
中有一个错误。”。innerexception状态{“不是预期的。”}
结论(更新):
我以前的问题是XML文件中的元素(查询)!=类的名称(SalesInquiry)。我们需要一个[XmlRoot]
属性,而不是类的[XmlElement]
属性。为了完整性,如果希望在序列化过程中忽略类中的属性,可以使用[XmlIgnore]
属性
我已经成功地序列化了我的对象,现在已经成功地将传入的XML反序列化为SalesInquiry对象
这种方法比手动解析XML容易得多。好吧,这是一个陡峭的学习曲线,但它是值得的
谢谢 如果XML使用模式(即,您总是知道哪些元素出现,以及它们在树中出现的位置),则可以使用XmlSerializer
创建对象。您只需要类上的一些属性来告诉序列化程序它们对应的XML元素或属性。然后加载XML,创建一个新的XmlSerializer
,使用要创建的.NET对象的类型,并调用反序列化方法
例如,您有这样一个类:
[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; }
}
Person person = null;
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (FileStream fs = new FileStream(GetFileName(), FileMode.Open))
{
person = (Person)serializer.Deserialize(fs);
}
更新:
根据您上次的更新,我猜要么您需要在充当根元素的类(即saleenquiry
)上指定XmlRoot
属性,要么XmlSerializer
可能会有点困惑,因为您在XML中引用的是空命名空间(xmlns='
似乎不正确).如果您的XML使用模式(即,您总是知道哪些元素出现,以及它们在树中出现的位置),则可以使用XmlSerializer
创建对象。您只需要类上的一些属性来告诉序列化程序它们对应的XML元素或属性。然后加载XML,创建一个新的XmlSerializer
,使用要创建的.NET对象的类型,并调用反序列化方法
例如,您有这样一个类:
[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; }
}
Person person = null;
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (FileStream fs = new FileStream(GetFileName(), FileMode.Open))
{
person = (Person)serializer.Deserialize(fs);
}
更新:
根据您上次的更新,我猜要么您需要在充当根元素的类(即saleenquiry
)上指定XmlRoot
属性,要么XmlSerializer
可能会有点困惑,因为您在XML中引用的是空命名空间(xmlns='
似乎不正确).XmlSerializer不支持数组和列表。。。只要包含的类型是可序列化的。XmlSerializer不支持数组和列表。。。只要包含的类型是可序列化的。我发现Xsd2Code对这类事情非常有用:
基本上,您所需要做的就是编写一个xsd文件(一个XML模式文件)并指定几个命令行开关。Xsd2Code将自动生成一个C#类文件,其中包含所有类和属性以及处理序列化所需的所有内容。这不是一个完美的解决方案,因为它不支持XSD的所有方面,但是如果XML文件是元素和属性的相对简单的集合,那么它应该是一条很好的捷径
Codeplex上还有另一个类似的项目,名为linqtoxsd(),该项目旨在强制执行整个XSD规范,但上次我检查时,它不再受支持,也没有真正准备好进入黄金时段。不过我觉得值得一提。我发现XSD2代码对这类事情非常有用:
基本上,您所需要做的就是编写一个xsd文件(一个XML模式文件)并指定几个命令行开关。Xsd2Code将自动生成一个C#类文件,其中包含所有类和属性以及处理序列化所需的所有内容。这不是一个完美的解决方案,因为它不支持XSD的所有方面,但是如果XML文件是元素和属性的相对简单的集合,那么它应该是一条很好的捷径
Codeplex上还有另一个类似的项目,名为linqtoxsd(),该项目旨在强制执行整个XSD规范,但上次我检查时,它不再受支持,也没有真正准备好进入黄金时段。不过,我觉得值得一提。XML附件是否符合特定的模式?它总是相同的模式吗?您是否正在将XML“分解”为