2013-07-07 2 views
2

Я пытаюсь десериализации документ XML:Игнорировать внешние элементы, используя XmlSerializer

<?xml version='1.0' encoding='UTF-8'?> 
<eveapi version="2"> 
    <currentTime>2013-07-07 07:24:20</currentTime> 
    <result> 
    <rowset name="characters" key="characterID" columns="name,characterID,corporationName,corporationID"> 
     <row name="xxxxx" characterID="1234" corporationName="xxxx" corporationID="1234" /> 
    </rowset> 
    </result> 
    <cachedUntil>2013-07-07 07:40:39</cachedUntil> 
</eveapi> 

Моя модель:

[XmlRoot("rowset")] 
public class CharacterList 
{ 
    public CharacterList() { Characters = new List<Character>(); } 

    [XmlElement("row")] 
    public List<Character> Characters { get; set; } 
} 

public class Character 
{ 
    [XmlElement("name")] 
    private string name { get; set; } 

    [XmlElement("characterID")] 
    private int Id { get; set; } 

    [XmlElement("corporationName")] 
    private string corporationName { get; set; } 

    [XmlElement("corporationID")] 
    private int corporationId { get; set; } 
} 

Мой десериализации код:

XmlRootAttribute xRoot = new XmlRootAttribute(); 
xRoot.ElementName = "result"; 
xRoot.IsNullable = true; 
var serializer = new XmlSerializer(typeof(Character), xRoot); 
var list = (CharacterList) serializer.Deserialize(output); 

Однако я я получаю исключение:

System.InvalidOperationException: There is an error in XML document (2,2). 

с внутренним типом:

System.InvalidOperationException: <eveapi xmlns=''> was not expected. 

Я уверен, что это из-за внешней информации мне не нужно. Есть ли способ игнорировать его? моя другая мысль заключалась в том, что я мог бы писать классы-оболочки для остальной части схемы, а затем просто игнорировать то, что мне неинтересно. Однако я надеялся, что есть более простой способ. Я застрял на этом какое-то время, любая помощь будет оценена по достоинству.

ответ

2

Вы можете использовать XmlReader для перехода к внутреннему элементу и использовать XmlSerializer оттуда:

using (XmlReader reader = XmlReader.Create("c:\\your.xml")) 
    { 
     reader.MoveToContent(); 
     reader.ReadToDescendant("rowset"); 
     var serializer = new XmlSerializer(typeof(CharacterList)); 
     var list = (CharacterList)serializer.Deserialize(reader); 
    } 

Пожалуйста, обратите внимание, что есть также некоторые проблемы в вашей модели:

  • Свойства должны быть общедоступными.
  • Использование XmlAttribute атрибутов вместо XmlElement
  • Использование TYPEOF (CharacterList) вместо TYPEOF (Character)

    [XmlRoot("rowset")] 
    public class CharacterList 
    { 
        public CharacterList() { Characters = new List<Character>(); } 
    
        [XmlElement("row")] 
        public List<Character> Characters { get; set; } 
    } 
    
    public class Character 
    { 
        [XmlAttribute("name")] 
        public string name { get; set; } 
    
        [XmlAttribute("characterID")] 
        public int Id { get; set; } 
    
        [XmlAttribute("corporationName")] 
        public string corporationName { get; set; } 
    
        [XmlAttribute("corporationID")] 
        public int corporationId { get; set; } 
    } 
    
1

Я не привык к XMLSerialzer, но как же использовать Linq-to-XML?

 string pathToXML = ""; 
     XDocument doc = XDocument.Load(pathToXML); 

     var qry = from ele in doc.Descendants("row") 
        select new 
        { 
         name = ele.Attribute("name").Value, 
         charID = Convert.ToInt32(ele.Attribute("characterID").Value), 
         corName = ele.Attribute("corporationName").Value, 
         corID = Convert.ToInt32(ele.Attribute("corporationID").Value) 
        }; 

     foreach (var element in qry) 
     { 
      Console.WriteLine(element.name + " " + element.charID + " " + element.corName + " " + element.corID); 
     } 
+0

сериализатору быстрее. – Evgeny

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