读取XML并解析为类和属性
读取XML并解析为类和属性
如何反序列化这个XML文档:
1020 Nissan Sentra 1010 Toyota Corolla 1111 Honda Accord
我有这个:
[Serializable()] public class Car { [System.Xml.Serialization.XmlElementAttribute("StockNumber")] public string StockNumber{ get; set; } [System.Xml.Serialization.XmlElementAttribute("Make")] public string Make{ get; set; } [System.Xml.Serialization.XmlElementAttribute("Model")] public string Model{ get; set; } }
.
[System.Xml.Serialization.XmlRootAttribute("Cars", Namespace = "", IsNullable = false)] public class Cars { [XmlArrayItem(typeof(Car))] public Car[] Car { get; set; } }
.
public class CarSerializer { public Cars Deserialize() { Cars[] cars = null; string path = HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data/") + "cars.xml"; XmlSerializer serializer = new XmlSerializer(typeof(Cars[])); StreamReader reader = new StreamReader(path); reader.ReadToEnd(); cars = (Cars[])serializer.Deserialize(reader); reader.Close(); return cars; } }
看起来不起作用 🙁
问题的出现原因:
该问题是由于需要读取和解析XML文件中的数据,并将其转换为C#类和属性的需求导致的。在这种情况下,使用xsd工具生成C#类是一种常见的解决方法。
解决方法:
下面是解决该问题的步骤:
1. 将XML文件保存到磁盘上(例如命名为foo.xml)。
2. 使用xsd命令生成XSD文件:xsd foo.xml。
3. 使用xsd命令生成C#类文件:xsd foo.xsd /classes。
4. 将生成的foo.cs文件包含在项目中。
5. 使用XmlSerializer类读取数据。以下是示例代码:
XmlSerializer ser = new XmlSerializer(typeof(Cars)); Cars cars; using (XmlReader reader = XmlReader.Create(path)) { cars = (Cars) ser.Deserialize(reader); }
值得注意的是,上述代码中的"path"可以是从Web响应创建的流。例如:var resp = response.Content.ReadAsByteArrayAsync(); var stream = new MemoryStream(resp.Result);
然而,对于某些更复杂的模型,上述生成的代码可能无法正常工作,并且命名方案可能不符合要求。在这种情况下,可能需要使用自定义方法解析XML数据。
如果不保存XML文件,而是直接从ServiceModel.Channels.Message GetReaderAtBodyContents方法中获取XmlReader对象,那么可以按照以下步骤使用XmlSerializer类:
1. 获取XmlReader对象。
2. 使用XmlSerializer类的Deserialize方法将XmlReader对象转换为所需的类和属性。
这是一个通用的解决方法,可以帮助读取和解析XML文件,并将其转换为C#类和属性。如果您遇到类似的问题,可以尝试使用上述方法解决。
问题的出现原因是在XML中,StockNumber、Make和Model的值是元素,而不是属性。此外,reader.ReadToEnd()方法读取整个流并返回一个字符串,因此Deserialize()函数无法再使用reader,因为reader的位置已经在流的末尾。解决方法是将XmlElementAttribute标签更改为XmlElement,并且删除reader.ReadToEnd()方法。还对命名进行了一些修改。
文章中提供了两个类Car和CarCollection,Car类有StockNumber、Make和Model三个属性,CarCollection类有一个Car类型的数组属性。
文章还提供了一个Deserialize函数,函数中使用了XmlSerializer类将xml反序列化为CarCollection对象。
xml的格式稍作调整,添加了一个新的元素来包装Cars,因为.Net在反序列化数组时比较挑剔。
文章中还提到了[Serializable]特性在使用XmlSerializer时是多余的,因为XmlSerializer根本不会检查它。大部分[Xml...]特性也是多余的,因为它只是模仿默认行为。
最后,还提到了Serializable特性已经过时,不应该再使用。
问题:如何从XML文件中读取并解析为类和属性?
原因:需要从XML文件中读取数据并将其解析为类和属性。
解决方法:
方法1:
1. 打开“Developer Command Prompt”。
2. 切换到XML文件所在的目录。
3. 使用命令"xsd file.xml"创建XSD文件。
4. 使用命令"xsd /c file.xsd"创建C#类。
5. 完成后,生成的C#类文件将保存在指定目录下。
方法2:
1. 将XML文件的内容复制到剪贴板。
2. 在解决方案中添加一个新的空类文件。
3. 打开该文件,点击菜单中的“Edit > Paste special > Paste XML As Classes”。
4. 完成后,生成的类将自动粘贴到新建的类文件中。
用法:
可以使用以下帮助类来简化操作:
using System; using System.IO; using System.Web.Script.Serialization; using System.Xml; using System.Xml.Serialization; namespace Helpers { internal static class ParseHelpers { private static JavaScriptSerializer json; private static JavaScriptSerializer JSON { get { return json ?? (json = new JavaScriptSerializer()); } } public static Stream ToStream(this string) { var stream = new MemoryStream(); var writer = new StreamWriter(stream); writer.Write(); writer.Flush(); stream.Position = 0; return stream; } public static T ParseXML(this string) where T : class { var reader = XmlReader.Create(.Trim().ToStream(), new XmlReaderSettings() { ConformanceLevel = ConformanceLevel.Document }); return new XmlSerializer(typeof(T)).Deserialize(reader) as T; } public static T ParseJSON (this string) where T : class { return JSON.Deserialize (.Trim()); } } }
使用示例:
public class JSONRoot { public catalog catalog { get; set; } } string xml = File.ReadAllText(@"D:\file.xml"); var catalog1 = xml.ParseXML(); string json = File.ReadAllText(@"D:\file.json"); var catalog2 = json.ParseJSON ();
以上就是从XML文件中读取并解析为类和属性的方法。