【发布时间】:2019-12-11 11:30:51
【问题描述】:
我正在尝试将 XML 内容序列化为对象。我正在使用.Net 4.6.1。我要序列化的 XML 是:
<THEROOT>
<ITEM>
<TITLE>
This is my title
</TITLE>
<DESCRIPTION>
<P>Line 1 of the description</P>
<P>Line 2 of the description</P>
<P>Final line of description</P>
</DESCRIPTION>
<MOREINFO>
<P>Some additional stuff here</P>
<P>And another line</P>
<P>And final line</P>
</MOREINFO>
</ITEM>
<ITEM>
<TITLE>
Another object is here
</TITLE>
<DESCRIPTION>
<P>Some description</P>
<P>That I need to parse</P>
<P>Into a string</P>
</DESCRIPTION>
<MOREINFO>
<P>More info lines</P>
<P>Would go here</P>
</MOREINFO>
</ITEM>
</THEROOT>
这是我要序列化的对象:
public class TestModel
{
[XmlRoot(ElementName = "THEROOT")]
public class TheRoot
{
[XmlElement(ElementName = "ITEM")]
public List<Item> Item { get; set; }
}
[XmlRoot(ElementName = "ITEM")]
public class Item
{
[XmlElement(ElementName = "TITLE")]
public string Title { get; set; }
[XmlElement(ElementName = "DESCRIPTION")]
public string Description { get; set; }
[XmlElement(ElementName = "MOREINFO")]
public string MoreInfo { get; set; }
}
}
为了完整起见,这是我的序列化代码(假设上面的 XML 内容是一个字符串)..
TestModel.TheRoot rootObject;
using (TextReader tr = new StringReader(myXML))
{
using (XmlTextReader xr = new XmlTextReader(tr))
{
xr.Namespaces = false;
XmlSerializer serializer = new XmlSerializer(typeof(TestModel.TheRoot));
rootObject = (TestModel.TheRoot)serializer.Deserialize(xr);
}
}
在当前状态下,我收到错误消息“只能对具有简单或空内容的元素调用 ReadElementString 方法”。我理解这是因为我的描述内容中有 html 标签,这些标签被反序列化为复杂对象。
我发现我“可以”将模型修改成这样......
public class TestModel
{
[XmlRoot(ElementName = "THEROOT")]
public class TheRoot
{
[XmlElement(ElementName = "ITEM")]
public List<Item> Item { get; set; }
}
[XmlRoot(ElementName = "ITEM")]
public class Item
{
[XmlElement(ElementName = "TITLE")]
public string Title { get; set; }
[XmlElement(ElementName = "DESCRIPTION")]
public Description Description { get; set; }
[XmlElement(ElementName = "MOREINFO")]
public MoreInfo MoreInfo { get; set; }
}
[XmlRoot(ElementName = "DESCRIPTION")]
public class Description
{
[XmlElement(ElementName = "P")]
public P[] P { get; set; }
}
[XmlRoot(ElementName = "MOREINFO")]
public class MoreInfo
{
[XmlElement(ElementName = "P")]
public P[] P { get; set; }
}
[XmlRoot(ElementName = "P")]
public class P
{
[XmlText]
public string Text { get; set; }
}
}
这在某种程度上确实有效 - 但是当我知道我只想将整个内容视为字符串时,这很麻烦。 假设我无法更改 XML 的格式,有没有办法可以将 Description 和 MoreInfo 节点都反序列化为单个字符串对象?
我在这里和其他网站上看到过各种帖子,但似乎都没有完美的工作。
【问题讨论】:
-
您总是可以只拥有一个只读属性,它将
P项目的内容作为一个字符串返回:public string Content => string.Join(" ", Description.P) -
我确实有,但问题是我首先需要将它序列化为某种结构。我宁愿不使用显示的第二个模型,因为它很乱(实际模型比这个大得多)。不过同意 - 如果有办法强制序列化程序将内容放入字符串数组或其他任何内容中 - 我可以与另一个解决方案一起执行此操作。
标签: c# .net xml deserialization