Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解析XML文件-选项?_C#_Xml_Parsing_Serialization_Xml Serialization - Fatal编程技术网

C# 解析XML文件-选项?

C# 解析XML文件-选项?,c#,xml,parsing,serialization,xml-serialization,C#,Xml,Parsing,Serialization,Xml Serialization,我正在开发一个系统,通过ExchangeWeb服务从电子邮件中提取XML附件,并通过我创建的自定义DAL对象将其输入数据库 我已设法提取XML附件并将其作为流准备好。。。他们的问题是如何解析这个流并填充DAL对象 我可以创建一个XMLTextReader并遍历每个元素。我不认为这有什么问题,除了我怀疑有一个更巧妙的方法。阅读器似乎将开始标记、标记内容和结束标记视为不同的元素(使用reader.NodeType)。我希望myValue被视为一个元素,而不是三个元素。就像我说的,我可以绕过这个问题,

我正在开发一个系统,通过ExchangeWeb服务从电子邮件中提取XML附件,并通过我创建的自定义DAL对象将其输入数据库

我已设法提取XML附件并将其作为流准备好。。。他们的问题是如何解析这个流并填充DAL对象

我可以创建一个XMLTextReader并遍历每个元素。我不认为这有什么问题,除了我怀疑有一个更巧妙的方法。阅读器似乎将开始标记、标记内容和结束标记视为不同的元素(使用reader.NodeType)。我希望myValue被视为一个元素,而不是三个元素。就像我说的,我可以绕过这个问题,但我相信一定有更好的办法

我想到了使用XML序列化程序(对我来说是全新的)的想法,但快速浏览一下就发现它们无法处理ArrayList和List(我使用的是List)

同样,我对LINQ还不熟悉,但也提到了LINQ到XML,但我看到的示例似乎相当复杂——尽管这只是因为我不熟悉

基本上,我不想要一个棍棒系统,但我不想使用任何复杂的技术和学习曲线,仅仅因为它“酷”

将此XML/流转换为我的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>
但是,我得到一个例外:“
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“分解”为