2

カスタムXML出力を実行する必要があるクラスがあるため、IXmlSerializableインターフェイスを実装します。ただし、xmlタグ名を変更する場合を除いて、デフォルトのシリアル化で出力するフィールドがいくつかあります。serializer.Serializeを呼び出すと、XMLでデフォルトのタグ名を取得します。どういうわけかこれらを変更できますか?

これが私のコードです:

public class myClass: IXmlSerializable
{
    //Some fields here that I do the custom serializing on
    ...

    // These fields I want the default serialization on except for tag names
    public string[] BatchId { get; set; }
    ...

    ... ReadXml and GetSchema methods are here ...

    public void WriteXml(XmlWriter writer)
    {                        
        XmlSerializer serializer = new XmlSerializer(typeof(string[]));
        serializer.Serialize(writer, BatchId);
        ... same for the other fields ...

        // This method does my custom xml stuff
        writeCustomXml(writer);   
    }

    // My custom xml method is here and works fine
    ...
}

これが私のXml出力です:

  <MyClass>
    <ArrayOfString>
      <string>2643-15-17</string>
      <string>2642-15-17</string>
      ...
    </ArrayOfString>
    ... My custom Xml that is correct ..
  </MyClass>

最終的には次のようになります。

  <MyClass>
    <BatchId>
      <id>2643-15-17</id>
      <id>2642-15-17</id>
      ...
    </BatchId>
    ... My custom Xml that is correct ..
  </MyClass>
4

3 に答える 3

7

多くの場合、XmlSerializeraを受け入れるコンストラクターオーバーロードを使用して、XmlAttributeOverridesこの追加の名前情報を指定できます(たとえば、newを渡すXmlRootAttribute)。ただし、これは配列AFAIKでは機能しません。このstring[]例では、手動で記述する方が簡単だと思います。ほとんどの場合、IXmlSerializable多くの余分な作業が必要です。このような理由から、可能な限り回避しています。ごめん。

于 2009-12-30T20:20:37.950 に答える
3

フィールドに属性をタグ付けして、シリアル化されたXMLを制御できます。たとえば、次の属性を追加します。

[XmlArray("BatchId")]
[XmlArrayItem("id")]
public string[] BatchId { get; set; }

おそらくそこに着くでしょう。

于 2009-12-30T20:06:26.890 に答える
0

誰かがまだこれを探しているなら、あなたは間違いなくXmlArrayItemを使うことができます、しかしこれはクラスのプロパティである必要があります。

読みやすくするために、同じ単語の複数形と単数形を使用する必要があります。

    /// <summary>
    /// Gets or sets the groups to which the computer is a member.
    /// </summary>
    [XmlArrayItem("Group")]
    public SerializableStringCollection Groups
    {
        get { return _Groups; }
        set { _Groups = value; }
    }
    private SerializableStringCollection _Groups = new SerializableStringCollection();



<Groups>
   <Group>Test</Group>
   <Group>Test2</Group>
</Groups>

デビッド

于 2016-09-01T14:00:20.117 に答える