2015-11-19 2 views
-1

Предположим, что у меня есть XML следующим образом:Deserialize вложенная XML только

<A> 
<B> 
    <users> 
    <user> 
    <Name>User1</Name> 
    </user> 
    <user> 
    <Name>User2</Name> 
    </user> 
</users> 
</B> 
</A> 

Я десериализации только users узел.

Вот что я делаю.

XmlSerializer serializer = new XmlSerializer(typeof(List<User>), new XmlRootAttribute("users")); 

StringReader sr = new StringReader(xmlstring); 
using (var reader = XmlReader.Create(sr)) 
{ 
    var resultda = serializer.Deserialize(reader); 
} 

Но он выбрасывает исключение <A xmlns=''> не ожидалось.

+0

Возможный дубликат [Deserialize часть XML в классы] (http://stackoverflow.com/questions/22083548/deserialize-a-portion-of-xml-into-classes) –

ответ

1

Вы должны определить конкретные параметры сериализации для класса User первый:

[XmlRoot("users")] 
[System.Xml.Serialization.XmlType(TypeName="user")] 
public class User 
{ 
    public string Name { get; set; } 
} 

И так как вы хотите, чтобы прочитать «пользователей» узел, вы должны сначала получить этот узел и десериализуйте этот узел:

XmlDocument xmlDocument = new XmlDocument(); 
xmlDocument.LoadXml(xmlstring); 
XmlNode usersNode = xmlDocument.SelectSingleNode("A/B/users"); 

StringReader sr = new StringReader(usersNode.OuterXml); 
using (var reader = XmlReader.Create(sr)) 
{ 
    List<User> resultda = (List<User>)serializer.Deserialize(reader); 
    Console.WriteLine(resultda.Count); 
} 

ПРИМЕЧАНИЕ: всегда полезно делать i т в обратном направлении, если у вас есть какие-либо проблемы с десериализации, смысл, просто заполнить объект и сериализации, попробуйте/негоден и, наконец, получить ожидаемое формате XML

 List<User> users = new List<User>(); 
     users.Add(new User { Name = "User 1" }); 
     users.Add(new User { Name = "User 2" }); 
     new XmlSerializer(typeof(List<User>), new XmlRootAttribute("users")).Serialize(Console.OpenStandardOutput(), users);