如何反序列化具有相同名称的XMLElement

本文关键字:XMLElement 反序列化 | 更新日期: 2023-09-27 18:05:46

我有XML根元素和同名的XML元素,我不确定我应该如何改变我的模型类

只要XML元素没有重复使用相同的名称,下面的代码就可以工作,在我的例子中,Gender list=1

更改XML输出格式是不可能的,因为它来自另一个系统,除非在c#代码级别过滤掉

XML
<?xml version="1.0"?>
 <Gender>
   <Gender list="1">
    <Item>
      <CODE>M</CODE>
      <DESCRIPTION>Male</DESCRIPTION> 
    </Item>
    <Item>
      <CODE>F</CODE>
      <DESCRIPTION>Female</DESCRIPTION>
    </Item>
   </Gender>
  </Gender>

模型类

 public class Gender
{
    [XmlElement("Item")]
    public List<Item> GenderList = new List<Item>();
}

public class Item
{
    [XmlElement("CODE")]
    public string Code { get; set; }
    [XmlElement("DESCRIPTION")]
    public string Description { get; set; }
}

XML解析类

public static class XMLPrasing
{
    public static Object ObjectToXML(string xml, Type objectType)
    {
        StringReader strReader = null;
        XmlSerializer serializer = null;
        XmlTextReader xmlReader = null;
        Object obj = null;
        try
        {
            strReader = new StringReader(xml);
            serializer = new XmlSerializer(objectType);
            xmlReader = new XmlTextReader(strReader);
            obj = serializer.Deserialize(xmlReader);
        }
        catch (Exception exp)
        {
            //Handle Exception Code
            var s = "d";
        }
        finally
        {
            if (xmlReader != null)
            {
                xmlReader.Close();
            }
            if (strReader != null)
            {
                strReader.Close();
            }
        }
        return obj;
    }

第二更新

如果我改变我的代码与不同的性别名称如下,那么这个工作,问题仍然是相同的如何处理相同的名称

<?xml version="1.0"?>
<Gender>
 <GenderX list="1">
   <Item>
    <CODE>M</CODE>
    <DESCRIPTION>Male</DESCRIPTION>
   </Item>
   <Item>
    <CODE>F</CODE>
    <DESCRIPTION>Female</DESCRIPTION>
   </Item>
  </GenderX>
 </Gender>

模型类

  [XmlRoot("Gender")]
public class Gender
{
    [XmlElement("GenderX")]
    public List<GenderX> GenderXList = new List<GenderX>();       
}

public class GenderX
{
    [XmlElement("Item")]
    public List<Item> GenderList = new List<Item>();
}

public class Item
{
    [XmlElement("CODE")]
    public string Code { get; set; }
    [XmlElement("DESCRIPTION")]
    public string Description { get; set; }
}

如何反序列化具有相同名称的XMLElement

我找到答案了

[XmlRoot("Gender")]
public class Gender
{
    [XmlElement("Gender")]
    public List<GenderListWrap> _GenderListWrap = new List<GenderListWrap>();       
}

public class GenderListWrap
{
    [XmlAttribute("list")]
    public string _ListTag { get; set; }
    [XmlElement("Item")]
    public List<Item> _GenderList = new List<Item>();
}

public class Item
{
    [XmlElement("CODE")]
    public string Code { get; set; }
    [XmlElement("DESCRIPTION")]
    public string Description { get; set; }
}

如果你只有一个顶层性别元素,那么这就足够了:

[XmlRoot(ElementName = "Gender")]
public class Genders
{
    [XmlElement(ElementName = "Gender")]
    public Gender gender { get; set; }
}
public class Gender
{
    [XmlElement(ElementName = "Item")]
    public List<Item> GenderList = new List<Item>();
}

public class Item
{
    [XmlElement("CODE")]
    public string Code { get; set; }
    [XmlElement("DESCRIPTION")]
    public string Description { get; set; }
}

我使用通用方法来反序列化XMLString。
这个方法接受xml字符串和反序列化的发送方模型类型。

你必须使用模型反序列化xml属性像这样,你不应该忘记写[Serializable]类属性和[XmlElement]属性

  [Serializable]
  public class Gender
{
    [XmlElement("Item")]
    public List<Item> GenderList = new List<Item>();
}

public class Item
{
    [XmlElement("CODE")]
    public string Code { get; set; }
    [XmlElement("DESCRIPTION")]
    public string Description { get; set; }
}
 public static T Deserialize<T>(string input) where T : class
        {
            Log.Debug("Deserialize" + typeof(T).Name, "xml string Deserialize ediliyor" + Environment.NewLine + input);            
            XmlSerializer ser = new XmlSerializer(typeof(T), "SetDefaultNamespace"); // optinal parameters DefaultNamespace
            using (StringReader sr = new StringReader(input))
            {
                var desearializedObject = (T)ser.Deserialize(sr);
                Log.Debug("Deserialize" + typeof(T).Name, "Obje Deserialize işlemi tamamlandı");
                return desearializedObject;
            }
        }

    Deserialize<Gender>(xmlString);