xml 字符串到对象的映射不会发生
xml string to Object mapping does not happen
我有一个以 xml 字符串形式发送响应的存储过程
所以我创建了一个 class 并想将此存储过程的响应映射到某种类型的对象
这是我的class,这是礼节。
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 的映射没有发生,道具是它们的默认值。
这是我从存储过程得到的响应类型
"<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 节点。
我做错了什么?
谢谢
[XmlRoot("Root")]
public class SiteItem
{
[XmlElement("SiteItem")]
public List<SiteItemChild> Child { get; set; }
}
和代表 child
的 class
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 其他发送数据集。
我有一个以 xml 字符串形式发送响应的存储过程
所以我创建了一个 class 并想将此存储过程的响应映射到某种类型的对象
这是我的class,这是礼节。
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 的映射没有发生,道具是它们的默认值。
这是我从存储过程得到的响应类型
"<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 节点。
我做错了什么?
谢谢
[XmlRoot("Root")]
public class SiteItem
{
[XmlElement("SiteItem")]
public List<SiteItemChild> Child { get; set; }
}
和代表 child
的 classpublic 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 其他发送数据集。