gpt4 book ai didi

c# - 解析 XML 文件 - 选项?

转载 作者:太空宇宙 更新时间:2023-11-03 17:59:45 25 4
gpt4 key购买 nike

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

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

我可以创建一个 XMLTextReader 并遍历每个元素。除了我怀疑有一种更巧妙的方式之外,我没有看到任何问题。阅读器似乎将开始标签、标签内容和结束标签视为不同的元素(使用 reader.NodeType)。我希望 myValue 被视为一个元素而不是三个元素。就像我说的,我可以解决这个问题,但我确信一定有更好的方法。

我遇到了使用 XML 序列化程序(对我来说是全新的)的想法,但快速浏览表明它们无法处理 ArrayLists 和 List(我正在使用 List)。

同样,我是 LINQ 的新手,但也提到了 LINQ-to-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>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>

更新 1 :
根据 Graham 的示例,我正在尝试反序列化。我想我已经为序列化设置了 DAL,包括指定 [XmlElement("whatever")]对于每个属性。我尝试使用以下内容进行反序列化:
SalesEnquiry enquiry = null;
XmlSerializer serializer = new XmlSerializer(typeof(SalesEnquiry));
enquiry = (SalesEnquiry)serializer.Deserialize(stream);

但是,我得到一个异常(exception):' There is an error in XML document (2, 2) '。内部异常状态 {"<enquiry xmlns=''> was not expected."}
结论 (更新):

我之前的问题是 XML 文件中的元素 (Enquiry) != 类的名称 (SalesEnquiry)。而不是 [XmlElement]类的属性,我们需要一个 [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; }
}

并像这样输入 XML(在此示例中保存在文件中):
<?xml version="1.0"?>
<Person>
<PersonName>Bob</PersonName>
<PersonAge>35</PersonAge>
<Children>
<Child>Chris</Child>
<Child>Alice</Child>
</Children>
</Person>

然后你创建一个 Person像这样的例子:
Person person = null;
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (FileStream fs = new FileStream(GetFileName(), FileMode.Open))
{
person = (Person)serializer.Deserialize(fs);
}

更新:
根据您上次的更新,我猜您需要指定 XmlRoot充当根元素的类的属性(即 SalesEnquiry )或 XmlSerializer您在 XML 中引用了一个空的命名空间可能会有些困惑( xmlns='' 似乎不正确)。

关于c# - 解析 XML 文件 - 选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3343096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com