【问题标题】:xml string to Object mapping does not happenxml 字符串到对象的映射不会发生
【发布时间】:2018-07-04 19:37:31
【问题描述】:

我有一个以 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>"

所以我首先删除了&lt;Root&gt; 和&lt;/root&gt;。删除&lt;/SiteItem&gt;,因为并非所有元素都有此节点结尾。

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

我在这里做错了什么?

谢谢

【问题讨论】:

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


    【解决方案1】:
    [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 节点有“/>”结束其他“>”和其他“......所以我被所有 SiteItems 标准化为有一个结束标签。

    标准

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

    为什么我选择了这个解决方案?具体到我的情况,业务逻辑是在程序中完成的,这里的问题是一些程序发送一个 xmlString 其他发送数据集。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-09-18
      • 2021-02-24
      • 2021-11-23
      • 2016-11-24
      • 2018-05-29
      • 2019-01-25
      • 1970-01-01
      相关资源
      最近更新 更多