2016-04-12 3 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'. 

Allready пытался

  • Добавление имени 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 откуда-то else или создать файл xml.xml и сохранить XML-код для приведенного выше кода для работы

+0

фактически разобрал его вручную с помощью XML читатель. Был лучше подходит к проблеме – JMan

0

Есть несколько проблем:

  • object не является допустимым именем для локальной переменной (пожалуйста, не забудьте использовать реальный код в следующий раз), это может быть @object;
  • действительный xml начинается с метки ?xml (например, <?xml version="1.0" ?>);
  • version является частью ?xml, если вы хотите атрибут xmlversion="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); 
Смежные вопросы