反序列化具有多个值的XML

6 浏览
0 Comments

反序列化具有多个值的XML

我正在使用C#中带有复杂元素的XML反序列化作为参考。我注意到有很多关于反序列化XML的讨论,但它们没有提到标签中包含多个值的情况。

我正在尝试将我的xml反序列化为对象数组。

我遇到了一个“在xml文档中有一个错误(1,2)”的错误。

我有一个通过HTTP GET请求检索到的格式化的xml字符串,如下所示:


   
      
         
                        
            
            
            ...
         
      
   

我有以下代码会一直抛出异常:

"An unhandled exception of type 'System.InvalidOperationException' occurred in System.Xml.dll"

异常是由以下代码引发的:

temp = (Test)new XmlSerializer(typeof(Test)).Deserialize(rdr);

但我不知道如何调试以找到错误。以下是完整的代码:

    XmlDocument xmldoc = new XmlDocument();
    xmldoc.LoadXml(xmlstring);
    XmlNodeList list = xmldoc.GetElementsByTagName("lvl2");
    for (int i = 0; i < list.Count; i++)
    {
        Test temp = new Test();
        using (XmlReader rdr = XmlReader.Create(new StringReader(list[i].InnerXml)))
        {
            temp = (Test)new XmlSerializer(typeof(Test)).Deserialize(rdr); // 在这里引发异常
        }
        Console.WriteLine(temp.id);
        Console.WriteLine(temp.overall.x);
    }
    [XmlRoot("lvl3")]
    public class Test{
        [XmlAttribute("id")]
        public string id { get; set; }
        [XmlAttribute("name")]
        public string name { get; set; }
        [XmlElement(ElementName = "lvl4a")]
        public Overall overall { get;set; }
    }
    public class Overall
    {
        [XmlAttribute("x")]
        public string x { get; set; }
        [XmlAttribute("y")]
        public string y { get;set; }
        [XmlAttribute("z")]
        public string z { get;set; }
    }

0
0 Comments

问题的原因是Test类中没有为val1val2属性设置公共属性,导致无法反序列化具有多个值的XML数据。解决方法是要么修复Test类,为val1val2属性设置公共属性,要么从XML中删除这些属性。XML的架构应与类结构相匹配。

以下是解决问题的代码示例:

public class Test
{
    public string val1 { get; set; }
    public string val2 { get; set; }
}
// Deserialize XML with multiple values
XmlSerializer serializer = new XmlSerializer(typeof(Test));
Test test;
using (StreamReader reader = new StreamReader("yourXmlFile.xml"))
{
    test = (Test)serializer.Deserialize(reader);
}
// Access the deserialized values
Console.WriteLine(test.val1);
Console.WriteLine(test.val2);

在上述示例中,我们首先修复了Test类,为val1val2属性设置了公共属性。然后,我们使用XmlSerializer类将XML文件反序列化为Test对象。最后,我们可以访问反序列化后的val1val2属性的值,并进行进一步处理。

请注意,如果XML的架构与类结构不匹配,仍然会导致反序列化失败。因此,在进行反序列化操作之前,请确保XML的架构与类结构一致。

0