3

私はこのクラスを持っています:

[XmlRoot("menuItem")]
public class MenuItem
{
    [XmlAttribute("text")]
    public string Text { get; set; }

    [XmlAttribute("isLink")]
    public bool IsLink { get; set; }

    [XmlAttribute("url")]
    public string Url { get; set; }

    [XmlArray("items", IsNullable = true)]
    public List<MenuItem> Items { get; set; }
}

メニュー階層を定義します。このクラスをシリアル化すると、3 レベル メニューの出力 XML は次のようになります。

<menuItem xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
text="Tools" isLink="false">
  <items>
    <MenuItem text="Market" isLink="false">
      <items>
        <MenuItem text="Market Analyzer" isLink="true" url="/tools/market/analyzer">
          <items xsi:nil="true" />
        </MenuItem>
      </items>
    </MenuItem>
    <MenuItem text="Banking" isLink="false">
      <items>
        <MenuItem text="Purchase" isLink="true" url="/buy?type=good">
          <items xsi:nil="true" />
        </MenuItem>
      </items>
    </MenuItem>
    <MenuItem text="General" isLink="false">
      <items>
        <MenuItem text="Forecasts" isLink="true" url="/wheather-forcasts?city=la">
          <items xsi:nil="true" />
        </MenuItem>
      </items>
    </MenuItem>
  </items>
</menuItem>

つまり、ルート子要素MenuItemの両方です。ルートとして、適切な大文字と小文字でシリアル化されます。ただし、子要素であるため、大文字と小文字が正しくありません。子アイテムの出力ではなく、シリアライザーを作成するにはどうすればよいですか。ここでは大文字と小文字の区別が重要です。menuItemmenuItemMenuItem

クラス自体に属性を設定しようとしまし[XmlElement]たが、次のエラーが発生しました。

属性 'XmlArrayItem' は、この宣言の種類では無効です。これは、'property、indexer、field、param、return' 宣言でのみ有効です。

また、それらのデフォルトの名前空間をそこに置きたくないし、子アイテムを空の要素として作成したくありません。最終的な XML ファイルは、次の XML の例のようにクリーンである必要があります。

<menuItem text='Tools' isLink='false'>
  <items>
    <menuItem text='Market' isLink='false'>
      <items>
        <menuItem text='Market Analyzer' isLink='true' url='/tools/market/analyzer' />
      </items>
    </menuItem>
    <menuItem text='Banking' isLink='false'>
      <items>
        <menuItem text='Purchase' isLink='true' url='/buy?type=good' />
      </items>
    </menuItem>
    <menuItem text='General' isLink='false'>
      <items>
        <menuItem text='Forecasts' isLink='true' url='/wheather-forcasts?city=la' />
      </items>
    </menuItem>
  </items>
</menuItem>

どの属性を使用すればよいですか?

4

1 に答える 1

6

XmlArrayItemAttributeIsNullable を追加して削除します。

[XmlArray("items"), XmlArrayItem("menuItem")]
public List<MenuItem> Items { get; set; }

余分な名前空間を取り除くには、次を使用する必要がありますXmlSerializerNamespaces

var ns = new XmlSerializerNamespaces();
ns.Add("","");
var ser = new XmlSerializer(typeof (MenuItem));
ser.Serialize(Console.Out, obj, ns);
于 2012-05-30T07:18:03.310 に答える