Мне нужно знать, как десериализовать конкретный XML в объекты, определенные в пользовательском классе в C # - PullRequest
2 голосов
/ 01 декабря 2010

Учитывая следующий XML:

   <?xml version="1.0" encoding="UTF-8"?>
   <userAttributeList>
       <attribute>
          <userId>12345678</userId>
          <attId>1234</attId>
          <attName>Group</attName>
          <attTypeId>8</attTypeId>
          <attTypeName>User Group</attTypeName>
          <attData>Member</attData>
       </attribute>
       <attribute>
          <userId>12345678</userId>
          <attId>1235</attId>
          <attName>Contact Name</attName>
          <attTypeId>16</attTypeId>
          <attTypeName>Contact Center Greeting</attTypeName>
          <attData>John Smith</attData>
      </attribute>
      ...
    </userAttributeList>

Я хочу десериализовать его в следующие классы:

[Serializable]
[XmlTypeAttribute(AnonymousType = true)]
public class UserAttributeList
{
    [XmlArray(ElementName = "userAttributeList")]
    [XmlArrayItem(ElementName = "attribute")]
    public List<UserAttribute> attributes { get; set; }

    public UserAttributeList()
    {
        attributes = new List<UserAttribute>();
    }
}


[Serializable]
public class UserAttribute
{
    public String userId { get; set; }
    public String attId { get; set; }
    public String attName { get; set; }
    public String attTypeId { get; set; }
    public String attTypeName { get; set; }
    public String attData { get; set; }
}

Используя код ниже, где GetResponseStream () возвращает перечисленный объект XMLвыше:

XmlRootAttribute xRoot = new XmlRootAttribute();
xRoot.ElementName = "userAttributeList";
xRoot.IsNullable = true;

XmlSerializer serializer = new XmlSerializer(typeof(UserAttributeList), xRoot);

try
{
    return (UserAttributeList)serializer.Deserialize(request.GetResponse().GetResponseStream());
}
catch (Exception exc)
{
    return null;
}

Мой код компилируется без ошибок, но возвращаемый UserAttributeList не показывает дочерние элементы «атрибута».Не выдается никаких ошибок

Ответы [ 2 ]

0 голосов
/ 01 декабря 2010

Лично я бы использовал LinqToXsd . Возьмите существующий xml, сгенерируйте xsd из него, затем используйте LinqToXsd, чтобы загрузить этот xml в объект LinqToXsd. Тогда вы можете делать такие вещи, как:

xml.company.com.reports.report.Load(xmlFileContents); 

чтобы построить POCO.

0 голосов
/ 01 декабря 2010

Я бы скорее сделал что-то вроде:

public class userAttributeList
{
    [XmlElement]
    public List<UserAttribute> attribute { get; set; }

    public UserAttributeList()
    {
        attribute = new List<UserAttribute>();
    }
}

public class UserAttribute
{
    public int userId { get; set; }
    public int attId { get; set; }
    public string attName { get; set; }
    public int attTypeId { get; set; }
    public string attTypeName { get; set; }
    public string attData { get; set; }
}
...