繁体   English   中英

使用不同的声明反序列化xml

[英]Deserializing xml with different declaration

我需要将以下XML反序列化为C#的对象

XML:

<rdlt version="1.5" xmlns:rdlt="http://www.rdlt.org" xmlns="http://www.rdlt.org">
    <created>2016-02-18T15:36:29.326+00:00</created>
    <updated>2016-02-18T15:36:29.326+00:00</updated>
</rdlt>

物体:

[XmlType(AnonymousType = true)]
[XmlRoot(Namespace = "http://www.rdml.org")]
public class Container
{
    [XmlElement(Namespace = "http://www.rdml.org")]
    public DateTime created { get; set; }
    [XmlElement(Namespace = "http://www.rdml.org")]
    public DateTime updated { get; set; }
}

反序列化:

var reader = XmlReader.Create(@"C:\tmp\test.xml");
var serializer = new DataContractSerializer(typeof(Container));
var object = serializer.ReadObject(reader);

我收到以下错误,指出元素和架构不匹配:

 Additional information: Error in line 1 position 2. Expecting element  
'Container' from namespace 'http://schemas.datacontract.org/2004/07/ConsoleApplication1'.. 
Encountered 'Element'  with name 'rdlt', namespace 'http://www.rdlt.org'.

已经尝试过

  • 将rdlt名称添加到根目录
  • reader.MoveToContent();
  • XmlReader

试试这个...此代码使用XmlSerializer .....

正在使用.....

using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;

课.....

[XmlRoot(ElementName = "rdlt", Namespace = "http://www.rdlt.org")]
public class Container
{
    [XmlElement(ElementName = "created", Namespace = "http://www.rdlt.org")]
    public string Created { get; set; }
    [XmlElement(ElementName = "updated", Namespace = "http://www.rdlt.org")]
    public string Updated { get; set; }
}

码.....

class Program
{
    static void Main(string[] args)
    {
        string strXML = File.ReadAllText("xml.xml");
        byte[] bufXML = ASCIIEncoding.UTF8.GetBytes(strXML);
        MemoryStream ms1 = new MemoryStream(bufXML);

        // Deserialize to object
        XmlSerializer serializer = new XmlSerializer(typeof(Container));
        try
        {
            using (XmlReader reader = new XmlTextReader(ms1))
            {
                Container deserializedXML = (Container)serializer.Deserialize(reader);

            }// put a break point here and mouse-over deserializedXML ….
        }
        catch (Exception ex)
        {
            throw;
        }
    }
}

您的XML

<rdlt version="1.5" xmlns:rdlt="http://www.rdlt.org" xmlns="http://www.rdlt.org">
    <created>2016-02-18T15:36:29.326+00:00</created>
    <updated>2016-02-18T15:36:29.326+00:00</updated>
</rdlt>

我正在从名为xml.xml的应用程序构建文件夹中的文件中将XML读取为字符串...您将需要从其他位置获取XML字符串或创建xml.xml文件并为上述代码保存XML上班

有几个问题:

  • object不是局部变量的有效名称(请确保下次使用实代码),它可能是@object
  • 有效xml以?xml标记开头(例如<?xml version="1.0" ?> );
  • version?xml的一部分,如果您想在根元素中使用xml属性 version="1.5" ,那么您会遇到麻烦;

如果必须反序列化该确切的xml ,那么唯一的选择是手动反序列化,例如,使用linq-to-xml:

var xml = XDocument.Load(@"C:\tmp\test.xml");
string version = xml.Root.Attribute("version").Value;
string space = "http://www.rdlt.org";
var obj = new Container()
{
    created = DateTime.Parse(xml.Root.Element(XName.Get("created", space)).Value),
    updated = DateTime.Parse(xml.Root.Element(XName.Get("updated", space)).Value),
};

如果您省略version并可以添加?xml标记,则DataSerializer应该可以工作。

例如,这个有效的 xml:

<?xml version="1.0" encoding="utf-8"?>
<rdlt xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.rdml.org">
    <created>0001-01-01T00:00:00</created>
    <updated>0001-01-01T00:00:00</updated>
</rdlt>

可以使用以下方法反序列化:

[DataContract(Name = "rdlt", Namespace = "http://www.rdml.org")]
public class Container
{
    [DataMember]
    public DateTime created { get; set; }
    [DataMember]
    public DateTime updated { get; set; }
}

// deserialize (using your code!)
var reader = XmlReader.Create(@"C:\tmp\test.xml");
var serializer = new DataContractSerializer(typeof(Container));
var obj = serializer.ReadObject(reader);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM