2016-04-12 29 views
0

我需要反序列化下面的XML到對象C#反序列化的XML與不同的聲明

的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
+0

我們希望您的問題已得到解決。如果沒有,也許想想更新你的問題.... http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work/5235#5235 – Monty

回答

1

試試這個...這個代碼使用XmlSerializer的.....

Usings .....

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以便上面的代碼工作

+0

實際上用XML手動解析它讀者。更適合這個問題 – JMan

0

有幾個問題:

  • object不是局部變量(請務必使用下一次真正的代碼),也可能是@object有效名稱;
  • 有效的xml以?xml標記(例如<?xml version="1.0" ?>)開頭;
  • version?xml的一部分,如果你想XML屬性version="1.5"在根元素,那麼你就有麻煩了;

如果您必須反序列化確切的xml,那麼您唯一的選擇是手動反序列化,例如,使用LINQ到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應該工作。

E.g.這有效 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);