我获取的XML是由外部来源提供的,因此我没有轻松重新格式化它的能力。我想在我的实体上使用xml属性,而不是编写一个知道XML和实体格式的linq查询。这是一个例子:
<?xml version="1.0"?>
<TERMS>
<TERM>
<ID>2013-2</ID>
<DESC>Spring 2013</DESC>
</TERM>
<TERM>
<ID>2013-3</ID>
<DESC>Summer 2013 Jun&Jul</DESC>
</TERM>
</TERMS>
我知道XMLSerializer期望的是ArrayOfTerm而不是TERMS,但我可以通过使用xml属性来调整实体以使用不同的元素名称,例如:
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
public class Term
{
[XmlElement("ID")]
public string id;
[XmlElement("DESC")]
public string desc;
}
我正在这样反序列化数据:
TermData data;
XmlSerializer serializer = new XmlSerializer(typeof(TermData));
using (StringReader reader = new StringReader(xml))
{
data = (TermData)serializer.Deserialize(reader);
}
return View(data.terms);
我面临的问题是TERMS既是根元素又是数组本身。如果XML有一个不是数组的根元素,我可以像这样编辑我的TermData类,并且反序列化将正确执行(已测试)。
[XmlRoot("ROOT")]
public class TermData
{
[XmlArray("TERMS")]
[XmlArrayItem("TERM")]
public List<Term> terms;
}
请注意,将TERMS用作XMLRoot无效。现在,我的代码会抛出异常。
InvalidOperationException: There is an error in XML document (2,2).
InnerException: "<TERMS xmlns=" was not expected.
这让我相信XML格式不正确,但据我所知,我给出的例子是完全有效的XML。如果我可以编辑源XML,这一切都将变得微不足道,但可能会有大量类似的响应,我需要能够适应任何可能出现的情况。我试过几乎所有方法,却无法在不编辑XML的情况下对其进行反序列化。如果不必定义一个包装类(TermData)来保存列表,这也将非常方便,但这似乎只适用于XML遵循序列化程序的命名约定(ArrayOfTerm等)。