读取XML并解析为类和属性

25 浏览
0 Comments

读取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;
    }
}

看起来不起作用 🙁

0
0 Comments

问题的出现原因:

该问题是由于需要读取和解析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#类和属性。如果您遇到类似的问题,可以尝试使用上述方法解决。

0
0 Comments

问题的出现原因是在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特性已经过时,不应该再使用。

0
0 Comments

问题:如何从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文件中读取并解析为类和属性的方法。

0