取得している XML は外部ソースから提供されているため、簡単に再フォーマットすることはできません。XML とエンティティがどのようにフォーマットされているかを知る linq クエリを作成する代わりに、エンティティで xml 属性を使用したいと考えています。次に例を示します。
<?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 が TERMS ではなく ArrayOfTerm を想定していることはわかっていますが、エンティティを微調整して、次のような 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;
}
XMLRoot として TERMS を使用しても機能しないことに注意してください。現在、私のコードは投げています
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 など) に従っている場合にのみ機能するようです。