19

取得している 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&amp;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 など) に従っている場合にのみ機能するようです。

4

1 に答える 1

23

多分あなたは試すことができます:

[XmlRoot("TERMS")]
public class TermData
{
    public TermData()
     {
       terms = new List<Term>();
     }

    [XmlElement("TERM")]
    public List<Term> terms{get;set;}
}

public class Term
{
    [XmlElement("ID")]
    public string id{get;set;}

    [XmlElement("DESC")]
    public string desc{get;set;}
}

これが役立つことを願って、

于 2013-03-06T22:03:40.003 に答える