1. ホーム
  2. c#

Xml属性でクラス名を変更するにはどうしたらいいですか?

2023-08-12 02:12:52

質問

という XML シリアライズ可能なクラスがあるとします。 Song :

[Serializable]
class Song
{
    public string Artist;
    public string SongTitle;
}

スペースを節約するために(また 半難読化 を半難読化するため)、xml要素の名前を変更することにしました。

[XmlRoot("g")]
class Song
{
    [XmlElement("a")]
    public string Artist;
    [XmlElement("s")]
    public string SongTitle;
}

これは次のようなXML出力を生成します。

<Song>
  <a>Britney Spears</a>
  <s>I Did It Again</s>
</Song>

クラス/オブジェクトの名前も変更/リマップしたい。例えば、上記の例では、クラス g . その結果、xmlは次のようになります。

<g>
  <a>Britney Spears</a>
  <s>I Did It Again</s>
</g>

クラス名を変更することは可能ですか? xml-attributes を介して ?

私は手動でDOMを作成/トラバースしたくないので、私はそれがデコレータを介して達成することができるかどうか疑問に思っていました。

事前にありがとうございます!

UPDATEです。 おっと! 今回、私は 本当に がまたやってしまった! 言い忘れましたが、実はSongオブジェクトのリストをXMLでシリアライズしているのです。

これがシリアライズのコードです。

    public static bool SaveSongs(List<Song> songs)
    {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Song>));
            using (TextWriter textWriter = new StreamWriter("filename"))
            {
                serializer.Serialize(textWriter, songs);
            }
    }

そして、これがXMLの出力です。

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfSong>
<Song>
  <a>Britney Spears</a>
  <s>Oops! I Did It Again</s>
</Song>
<Song>
  <a>Rihanna</a>
  <s>A Girl Like Me</s>
</Song>
</ArrayOfSong>

どうやら、この XmlRoot() 属性はリストコンテキストでオブジェクトの名前を変更しないようです。

私は何かを見逃しているのでしょうか?

どのように解決するのですか?

XmlRoot属性を確認してください。

ドキュメントはこちらでご覧になれます。 http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlrootattribute(v=VS.90).aspx

[XmlRoot(Namespace = "www.contoso.com", 
     ElementName = "MyGroupName", 
     DataType = "string", 
     IsNullable=true)]
public class Group

UPDATEです。 試したところ、VS 2008で完全に動作しました。 このコードです。

[XmlRoot(ElementName = "sgr")]
public class SongGroup
{
    public SongGroup()
    {
       this.Songs = new List<Song>();
    }



[XmlElement(ElementName = "sgs")]
    public List<Song> Songs { get; set; }
}

[XmlRoot(ElementName = "g")]
public class Song
{
    [XmlElement("a")]
    public string Artist { get; set; }

    [XmlElement("s")]
    public string SongTitle { get; set; }
} 

出力します。

<?xml version="1.0" encoding="utf-8"?>
<sgr xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www
.w3.org/2001/XMLSchema">
  <sgs>
    <a>A1</a>
    <s>S1</s>
  </sgs>
  <sgs>
    <a>A2</a>
    <s>S2</s>
  </sgs>
</sgr>