2015-07-31 2 views
0

Я пытаюсь десериализовать некоторые xml. Вот оно:Deserialize xml не получает элемент

<FooBars xmlns="http://foos"> 
    <Id1 xmlns="http://bars">2</Id1> 
    <Id2 xmlns="http://bars">7</Id2> 
    <Info xmlns="http://bars"> 
    <Data> 
     <Field1>text1</Field1> 
     <Field2>text2</Field2> 
     <Field3>text3</Field3> 
    </Data> 
    <Data> 
     <Field1>text5</Field1> 
     <Field2>text6</Field2> 
     <Field3>text7</Field3> 
    </Data> 
    </Info> 
</FooBars> 

Я попытался это:

var myData = (FooBars)serializer.Deserialize(foobars.CreateReader()); 
... 


[XmlRoot(ElementName = "FooBars", Namespace = "http://foos")] 
public class FooBars 
{ 
    [XmlElement(ElementName = "Id1", Namespace = "http://bars")] 
    public string Id1 { get; set; } 

    [XmlElement(ElementName = "Id2", Namespace = "http://bars")] 
    public string Id2 { get; set; } 

    [XmlElement(ElementName = "Info", Namespace = "http://bars")] 
    public List<Data> Info { get; set; } 

} 

public class Data 
{ 
    [XmlElement(ElementName = "Field1")] 
    public string Field1 { get; set; } 

    [XmlElement(ElementName = "Field2")] 
    public string Field2 { get; set; } 
} 

Но это выглядит как класс данных не рассматривается как часть XML, так как он не сможет прочитать его. Я получаю все остальные элементы (ids), но не вещи, определенные в Data. Где я ошибаюсь?

+0

Информация отсутствует закрывающая бирка? Основываясь на вашем отступе, он должен содержать элементы данных? – jacoblambert

+0

К сожалению, отсутствующий тег является копией. Я хочу, чтобы результат содержал то, что определено в классе FooBars. Часть данных в элементе Info - это тот, который отсутствует в результатах – Cyan

ответ

1

Предположив отсутствует </Info> тег опечатка, Все, что вам нужно, это XmlArray и XmlArrayItem

[XmlRoot(ElementName = "FooBars", Namespace = "http://foos")] 
public class FooBars 
{ 
    [XmlElement(ElementName = "Id1", Namespace = "http://bars")] 
    public string Id1 { get; set; } 

    [XmlElement(ElementName = "Id2", Namespace = "http://bars")] 
    public string Id2 { get; set; } 

    [XmlArray(ElementName = "Info", Namespace = "http://bars"), XmlArrayItem("Data")] //<-- 
    public List<Data> Info { get; set; } 

} 
0

В XML отсутствует закрывающий тег для Info. Кроме того, вам необходимо определить свойство Field3 в классе Data и добавить к нему пространство имен 'http://bars'.

+0

Мне не нужен поле3 – Cyan

0

Если XML не хватает информации закрывающий тег, предназначенный содержать элементы данных, то ваши классы должны выглядеть примерно так:

[XmlRoot(ElementName = "FooBars", Namespace = "http://foos")] 
public class FooBars 
{ 
    [XmlElement(ElementName = "Id1", Namespace = "http://bars")] 
    public string Id1 { get; set; } 

    [XmlElement(ElementName = "Id2", Namespace = "http://bars")] 
    public string Id2 { get; set; } 

    [XmlElement(ElementName = "Info", Namespace = "http://bars")] 
    public Info Information { get;set; } 

} 

public class Info { 
    [XmlElement(ElementName = "Data", Namespace = "")] 
    public Info[] Info { get; set; } 
} 

public class Data 
{ 
    [XmlElement(ElementName = "Field1")] 
    public string Field1 { get; set; } 

    [XmlElement(ElementName = "Field2")] 
    public string Field2 { get; set; } 
} 

Обратите внимание, как в вашем XML-объект информации в основном содержит все данные, а не FooBars, как вы разработали классы.

+0

, это имеет смысл. вы хотели сделать public Data [] Inf {get; задавать; } в классе Info, который я предполагаю. К сожалению, это все еще не работает, поскольку я не возвращаю объекты Data (они равны нулю) – Cyan

0

через LINQPad - вы можете увидеть свойства полей равны нулю в myData.Info собственности, и это ваша проблема, не так ли? ОБНОВЛЕНО

void Main() 
{ 
    string xmlString; 
    string path = @"C:\Temp\exampleXmlSO.xml"; 

    using (StreamReader streamReader = File.OpenText(path)) 
    { 
     xmlString = streamReader.ReadToEnd(); 
    } 
    XmlSerializer serializer = new XmlSerializer(typeof(FooBars)); 


    using (StringReader stringReader = new StringReader(xmlString)) 
    { 
     var myData = (FooBars)serializer.Deserialize(stringReader); 
     Console.WriteLine(myData); 
    } 
} 

[XmlRoot(ElementName = "FooBars", Namespace = "http://foos")] 
public class FooBars 
{ 
    [XmlElement(ElementName = "Id1", Namespace = "http://bars")] 
    public string Id1 { get; set; } 

    [XmlElement(ElementName = "Id2", Namespace = "http://bars")] 
    public string Id2 { get; set; } 

    [XmlArray(ElementName = "Info", Namespace = "http://bars"), XmlArrayItem("Data")] //<-- 
    public List<Data> Info { get; set; } 

} 


[Serializable] 
public class Data 
{ 
    [XmlElement(ElementName = "Field1")] 
    public string Field1 { get; set; } 

    [XmlElement(ElementName = "Field2")] 
    public string Field2 { get; set; } 

    [XmlIgnore] 
    public string Field3 { get; set; } 
} 
+0

да, это он. – Cyan

+0

'Надеюсь, кто-то еще получит ответ, прежде чем я вернусь. Я уже разместил его перед вашим ответом. Протестировано с помощью xml. – EZI

+0

да, вы сделали. я не понял. вы получаете кредит, но обновленный мой для полноты. Благодарю. – jacoblambert