我得到的 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,这一切都将是微不足道的,但可能有很多其他类似的响应,我需要能够灵活处理我可能得到的任何东西。我要确认的是 XMLSerializer 是否可以支持这种类型的 XML 结构。我已经测试了几乎所有内容,如果不编辑 XML,就无法对其进行反序列化。如果我不必定义一个包装类(TermData)来保存列表,这也会很方便,但这似乎只有在 xml 遵循序列化程序的命名约定(ArrayOfTerm 等)时才有效。