不会发生xml字符串到对象映射

时间:2018-01-25 14:07:29

标签: c# .net xml xml-serialization xml-deserialization

我有一个存储过程,它将响应作为xml字符串发送

所以我创建了一个类,并希望将此存储过程的响应映射到某种类型的Object

这是我的班级和它的礼仪。

Populate方法是我想要进行xml到对象映射的地方。

[XmlRoot("SiteItem")]
    public class SiteItem : BaseEntity<SiteItem>
    {
        [XmlElement("IdSiteItem")]
        public int IdSiteItem { get; set; }

        [XmlElement("ItemName")]
        public string ItemName{ get; set; }

        public override SiteItem Populate(DataRow entity)
        {
            var column = entity["Column1"].ToString();
            XmlSerializer serialize = new XmlSerializer(typeof(SiteItem));
        string result = column.Replace("<Root>", "");
            result = result.Replace("</Root>", "");
            result = result.Replace("</SiteItem>", "");
            result = result.Replace("/>", ">");
            result = result.Replace(">", "/>|");

        System.Collections.Generic.List<string> siteItems = result.Split('|').ToList();
        siteItems.RemoveAll(item => string.IsNullOrEmpty(item));

        foreach (var item in siteItems)
        {
            using (StringReader stream = new System.IO.StringReader(item))
            {
                SiteItem response = (SiteItem)serialize.Deserialize(stream); 

//=> response  always null
//=> stream has the following format 
//=> <SiteItem IdSiteItem=\"8436\" ItemName=\"demoweb\" >
            }
        }

        return null;
    }
}

}

问题是从xml节点到SiteItem的映射没有发生,props是它们的默认值。

这是我从存储过程中获得的响应类型

"<Root>
    <SiteItem IdSiteItem=\"8436\" ItemName=\"demoweb\" >
    <SiteItem IdSiteItem=\"8465\" ItemName=\"\" />
    <SiteItem IdSiteItem=\"8535\" ItemName=\"DocumentPreview\" /></SiteItem>
    <SiteItem IdSiteItem=\"7413\" ItemName=\"GlobalNews Search\"  />
    <SiteItem IdSiteItem=\"5838\" ItemName=\"GlobalQuestionsForm\" />
</Root>"

所以我做的是首先删除<Root></root>。删除</SiteItem>,因为并非所有元素都有此节点结束。

获取一个没有Root和/ SiteItem的字符串后,我已经应用了分隔符“|”这样我就可以将字符串拆分并存储为字符串列表 每个列表项都是一个SiteItem节点。

我在这里做错了什么?

谢谢

1 个答案:

答案 0 :(得分:0)

[XmlRoot("Root")]
public class SiteItem 
{
    [XmlElement("SiteItem")]
    public List<SiteItemChild> Child { get; set; }
}

还有代表孩子的班级

public class SiteItemChild  
{
      [XmlAttribute("IdSiteItem")]
      public int IdSiteItem { get; set; }

      [XmlAttribute("ItemName")]
      public int ItemName{ get; set; } 
}                                                      

这是反序列化器。

public SiteItem Deserialize(string xmlString)
{
    using (StringReader reader = new StringReader(xmlString));
    {
        XmlSerializer serializer = new XmlSerializer(typeof(SiteItem));
        SiteItem @object = (SiteItem)serializer.Deserialize(reader);

       return @object;
    }
}

解决这种情况的更好方法。

public SiteItem Deserialize(string xmlString)
{
        string processedXml = xmlString.Replace("<Root>" , "");
        processedXml = processedXml.Replace("</Root>" , "");

        processedXml = processedXml.Replace("</SiteItem>", "");
        processedXml = processedXml.Replace(" />", ">");

        processedXml = processedXml.Replace(">", "></SiteItem>");
        processedXml = processedXml.Insert(0, "<Root>");
        processedXml = processedXml.Insert(processedXml.Length, "
         </Root>");

        using (StringReader reader = new StringReader(processedXml));
        {
            XmlSerializer serializer = new XmlSerializer(typeof(SiteItem));
            SiteItem @object = (SiteItem)serializer.Deserialize(reader);

            return @object;
        }
    }

为什么我要这样做?因为某些SiteItem节点的元素以“ />”结尾,而其他“>”和其他“……”,所以我将所有SiteItem标准化为具有结束标记。

标准

在最后一个字符串处理部分中,我再次添加了Root开始和结束标记。

为什么我选择此解决方案?对我而言,业务逻辑是在过程中完成的,这里的问题是某些过程发送xmlString,其他发送数据集。