2013-12-13 3 views
1

Я пытаюсь десериализовать документ Xml для массива объекта. Я сделал это с Xna, но для monogame мне нужно изменить свой метод.Ошибка в документе XML

это, как я десериализации:

public static XmlData[] DeserializeFromXml<XmlData>(string inputFile) 

    { 
     XmlSerializer s = new XmlSerializer(typeof(XmlData)); 
     XmlData[] deserializedObject = default(XmlData[]); 
     byte[] byteArray = Encoding.UTF8.GetBytes(inputFile); 
     //byte[] byteArray = Encoding.ASCII.GetBytes(contents); 
     MemoryStream stream = new MemoryStream(byteArray); 
     using (TextReader textReader = new StreamReader(stream)) 
     { 
      deserializedObject = (XmlData[])s.Deserialize(textReader); 
     } 

     return deserializedObject; 
    } 

мой класс XMLDATA:

public class XmlData 
{ 
    public int id; 
    public int posx; 
    public int posy; 
    public int rot; 
    public int Width; 
    public int Height; 
} 

мой файл XML:

<?xml version="1.0" encoding="utf-8" ?> 
    <Asset Type="XmlData[]"> 
    <Item> 
     <id>17</id> 
     <posx>54</posx> 
     <posy>30</posy> 
     <rot>90</rot> 
     <Width>184</Width> 
     <Height>5</Height> 
    </Item> 
    <Item> 
     <id>1</id> 
     <posx>200</posx> 
     <posy>120</posy> 
     <rot>0</rot> 
     <Width>100</Width> 
     <Height>90</Height> 
    </Item> 
</Asset> 

И у меня есть следующее сообщение об ошибке:

There is an error in XML document (1, 1). (i'm using monogame) 
+0

закрывающий тег вашей корневой имеет первую букву вниз случай. –

+2

Является ли тот факт, что открывающий тег является «Asset» (с верхним регистром A) и закрывающим тегом 'asset' является опечатка в вопросе или ваш XML-контент подобен этому? –

+0

Nop missclick, оба в верхнем регистре – Gabson

ответ

0

Спасибо на @terrybozzio я наконец нашел способ прочитать мой XML-файл, прежде чем мне пришлось преобразовать его в поток. Но с Monogame Framework реализованы не alll-методы.

способ сделать это:

public static List<XmlData> DeserializeFromXml(string inputFile) 
    { 
     List<XmlData> mydata = new List<XmlData>(); 
     XmlSerializer s = new XmlSerializer(typeof(List<XmlData>), new XmlRootAttribute("Asset")); 
     //XmlData[] deserializedObject = default(XmlData[]); 
     // byte[] byteArray = Encoding.UTF8.GetBytes(inputFile); 
    // byte[] byteArray = Encoding.ASCII.GetBytes(inputfile); 
     // MemoryStream stream = new MemoryStream(byteArray); 

     Stream test = TitleContainer.OpenStream("pets.xml"); 
     using (TextReader txtReader = new StreamReader(test)) 
     { 
      mydata = (List<XmlData>)s.Deserialize(txtReader); 
     } 

     return mydata; 
    } 
1
Encoding.UTF8.GetBytes(inputFile); 

Вы пытаетесь декодировать имя файла здесь не filecontent.

Попробуйте что-то вроде

using (StreamReader reader = StreamReader(inputFile,Encoding.UTF8,true)) 
{ 
    XmlSerializer serializer = new XmlSerializer(typeof(XmlData)); 
    return (XmlData[])serializer.Deserialize(reader); 
} 
+0

Я не мог отправить имя файла StreamReader(); так как это исправить? – Gabson

+0

Первый аргумент - это поток, а не строка. Вот почему я использовал MemoryStream – Gabson

+0

Да? Это одна из нескольких перегрузок конструктора StreamReader, из которых вы можете выбрать. Я взял более подходящий. Есть ли вопрос, стоящий за вашим комментарием? – Ralf

0

вы можете использовать этот код !!

 using (XmlTextReader xmlReader = new XmlTextReader(yourfile)) 
     { 
      XDocument xdoc = XDocument.Load(xmlReader); 
      var programs= from programItem in xdoc.Root.Elements() 
          select new xmldata { 
       Id = Convert.ToInt32(programItem.Attribute("Id").Value), 
       posx = Convert.ToInt32( programItem.Attribute("posx").Value), 
       poxy = Convert.ToInt32(programItem.Attribute("poxy").Value), 
      }; 

      result = programs.ToList(); 
     } 
+0

Не находите XmlTextReader, возможно, cuase я использую Monogame, но никогда не видел этого раньше. – Gabson

+0

нужно только добавить библиотеку System.Xml.XmlReader или System.Xml.XmlTextReader –

1

Ok Это будет работать на файле XML:

public static List<XmlData> DeserializeFromXml(string inputFile) 
{ 
    List<XmlData> mydata = new List<XmlData>(); 
    XmlSerializer s = new XmlSerializer(typeof(List<XmlData>),new XmlRootAttribute("Asset")); 
    //XmlData[] deserializedObject = default(XmlData[]); 
    //byte[] byteArray = Encoding.UTF8.GetBytes(inputFile); 
    //byte[] byteArray = Encoding.ASCII.GetBytes(contents); 
    //MemoryStream stream = new MemoryStream(byteArray); 
    using (TextReader txtReader = new StreamReader(inputFile)) 
    { 
     mydata = (List<XmlData>)s.Deserialize(txtReader); 
    } 

    return mydata; 
} 

Изменение <Item> к <XmlData> и вы хорошо, или поместите это в объявлении класса XMLDATA:

[XmlType("Item")] 
public class XmlData 
+0

У меня есть следующее сообщение: «Невозможно преобразовать строку в поток» в строке 'new streamreader (inputFile)' – Gabson

+0

Мне пришлось расколоть строку 'Memorystream = new streamreader();' но я думаю, что я пытаюсь десериализовать hte строку. Я думаю, что конструктор streamReader (string) не обрабатывается моей инфраструктурой. Если бы вы могли помочь мне это решить. благодаря – Gabson

Смежные вопросы