无法将简单的 XML 解析为对象? [英] Cannot parse simple XML into an object?

查看:31
本文介绍了无法将简单的 XML 解析为对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

XML

<MeterWalkOrder>
  <Name>Red Route</Name>
  <Meters>
    <Meter>
      <MeterID>1</MeterID>
      <SerialNumber>12345</SerialNumber>
    </Meter>
    <Meter>
      <MeterID>2</MeterID>
      <SerialNumber>SE</SerialNumber>
    </Meter>
  </Meters>
</MeterWalkOrder>

我无法使用任何序列化程序将简单的 XML 导入对象

I cannot get simple XML into an object using any serializer

var xml = File.ReadAllText("WalkOrder.xml");
var xmlSerializer = new NFormats.Xml.XmlSerializer();
var obj = xmlSerializer.Deserialize<MeterWalkOrder>(new StringReader(xml));

我只取回了 2 米对象,这些对象没有设置任何属性,名称甚至没有按步行顺序设置.

I just get back 2 meter objects that have none of the attributes set and the name is not even set in walk order.

 public partial class MeterWalkOrder
 {
        public MeterWalkOrder()
        {
            Meters = new List<Meter>();
        }

        [DataMember]
        public String Name { get; set; }
     }
}

using System;
using System.Xml.Serialization;

namespace WindowsFormsApplication1.Classes
{    
    public class Meter : IMeter
    {
        [XmlAttribute]
        public int MeterID { get; set; }

        [XmlAttribute]
        public String SerialNumber { get; set; }
    }
}

我愿意尝试任何 xml 序列化程序.

I am willing to try any xml serializer.

推荐答案

首先我建议你阅读 在 MSDN 上介绍 XML 序列化您犯了几个错误,导致在运行代码时抛出未提及的异常.

First of all i suggest you to read Introducing XML Serialization on MSDN You made a couple of errors which lead to not mentioned exceptions thrown when you run your code.

  1. 在您的 Xml MeterID 和 SerialNumber 中不是属性,它们是元素.(正如怀亚特·厄普评论的那样)
  2. 如果你想序列化一些东西,你必须告诉它应该是 [Serializable]
  3. 序列化需要一个已实现的公共空构造函数
  4. 不关闭流时不要打开流(使用使用")
  5. 要测试您的序列化是否效果最好,请先序列化,然后检查输出,然后实施反序列化

在下面找到一个完整的示例:

Find a fully working example below:

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml;
using System.Xml.Serialization;

namespace X123
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            MeterWalkOrder mo = new MeterWalkOrder();
            mo.Name = "name";
            mo.Meters.Add(new Meter { MeterID = 1, SerialNumber = "kdkdkd" });
            mo.Meters.Add(new Meter { MeterID = 2, SerialNumber = "holladrio" });

            var xmlSerializer = new XmlSerializer(typeof(MeterWalkOrder), new Type[] { typeof(Meter) });
            {
                xmlSerializer.Serialize(File.CreateText("hello.xml"), mo);
                using (Stream s = File.OpenRead("hello.xml"))
                {
                    var obj = xmlSerializer.Deserialize(s);
                }
            }
        }



    }

    [Serializable]
    public class MeterWalkOrder
    {
        public MeterWalkOrder()
        {
        }

        public string Name { get; set; }
        public List<Meter> Meters { get { return meters; } set { meters = value; } }
        private List<Meter> meters = new List<Meter>();
    }

    [Serializable]
    public class Meter
    {
        public Meter()
        {
        }

        [XmlAttribute]
        public int MeterID { get; set; }

        [XmlAttribute]
        public string SerialNumber { get; set; }
    }

这篇关于无法将简单的 XML 解析为对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆