2012-02-03 33 views
2

を削除し、私は以下のクラスがあります。C#のXMLシリアル化ジャグ配列の要素名

public class MainRequest 
{ 
    private Request _dataField; 

    [XmlElementAttribute("Parameters")] 
    public Request Parameters 
    { 
     get 
     { 
      return _dataField; 
     } 
     set 
     { 
      _dataField = value; 
     } 
    } 
} 


public class Request 
{ 
    private RequestSize _requestSize; 

    private Field[][] _field; 

    [XmlElementAttribute(IsNullable = true)] 
    public RequestSize RequestSize 
    { 
     get 
     { 
      return _requestSize; 
     } 
     set 
     { 
      _requestSize = value; 
     } 
    } 

    [XmlArrayItem("BatchEntry")] 
    [XmlArrayItemAttribute("ParameterEntry", IsNullable = false, NestingLevel = 1)] 
    public Field[][] Batch 
    { 
     get 
     { 
      return _field; 
     } 
     set 
     { 
      _field = value; 
     } 
    } 
} 

public class RequestSize 
{ 
    private string _count; 

    private string _value; 

    [XmlAttributeAttribute] 
    public string Count 
    { 
     get 
     { 
      return _count; 
     } 
     set 
     { 
      _count = value; 
     } 
    } 

    [XmlTextAttribute] 
    public string Value 
    { 
     get 
     { 
      return _value; 
     } 
     set 
     { 
      _value = value; 
     } 
    } 
} 


public class Field 
{ 

    private string _fieldName; 

    private string _fieldValue; 

    [XmlAttributeAttribute(AttributeName = "name")] 
    public string Name 
    { 
     get 
     { 
      return _fieldName; 
     } 
     set 
     { 
      _fieldName = value; 
     } 
    } 

    [XmlTextAttribute] 
    public string Value 
    { 
     get 
     { 
      return _fieldValue; 
     } 
     set 
     { 
      _fieldValue = value; 
     } 
    } 
} 

彼らはシリアライズされるとき私が取得:

<Parameters> 
    <RequestSize Count="1">2</RequestSize> 
    <Batch> 
    <BatchEntry> 
     <ParameterEntry name="AAA">111</ParameterEntry> 
     <ParameterEntry name="BBB">222</ParameterEntry> 
     <ParameterEntry name="CCC">333</ParameterEntry> 
    </BatchEntry> 
    </Batch> 
</Parameters> 

私はバッチ要素を取り除くためにしようとしていますが。私は、XMLは次のようになりたいのです:

<Parameters> 
    <RequestSize Count="1">2</RequestSize> 
    <BatchEntry> 
    <ParameterEntry name="AAA">111</ParameterEntry> 
    <ParameterEntry name="BBB">222</ParameterEntry> 
    <ParameterEntry name="CCC">333</ParameterEntry> 
    </BatchEntry> 
</Parameters> 

私がいることを[] []フィールド上のXmlElement属性を使用して私が行うとき、私はエラーを取得しようとした:

​​

があります私は最上位の要素名なしで配列要素をシリアル化することができますか?実験を通して、あなたはBatchEntryBatchの名前を変更する必要があります

+0

を私はちょうどそれを試して、私の答えを編集しました。私はそれがうまくいくと思う。 – Corylulu

答えて

3

のようなものを試してみてください。ギザギザの配列にXmlElement属性を適用する方法はありません。のは、それBatch名前を付けてみましょう - - 今度はあなたのFieldタイプの配列が含まれていることになるしかしXmlSerializer bug when serializing collection of collections without root element?

を参照してください、何を行うことができ、新しいタイプの単純な配列にあなたのField[][]ジャグ配列を分解です。次のコードは、あなたが後にしているXMLを生成:生成

public class MainRequest 
{ 
    [XmlElementAttribute("Parameters")] 
    public Request Parameters { get; set; } 
} 

public class Request 
{ 
    [XmlElementAttribute(IsNullable = true)] 
    public RequestSize RequestSize { get; set; } 

    [XmlElement("BatchEntry")] 
    public Batch[] Batches { get; set; } 
} 

public class RequestSize 
{ 
    [XmlAttributeAttribute] 
    public string Count { get; set; } 

    [XmlTextAttribute] 
    public string Value { get; set; } 
} 

public class Batch 
{ 
    [XmlElementAttribute("ParameterEntry")] 
    public Field[] Fields { get; set; } 
} 

public class Field 
{ 
    [XmlAttributeAttribute(AttributeName = "name")] 
    public string Name { get; set; } 

    [XmlTextAttribute] 
    public string Value { get; set; } 
} 

public static void Main(string[] args) 
{ 
    var request = new MainRequest 
    { 
     Parameters = new Request 
     { 
      RequestSize = new RequestSize 
      { 
       Count = "1", 
       Value = "2", 
      }, 
      Batches = new Batch[] 
      { 
       new Batch 
       { 
        Fields = new Field[] 
        { 
         new Field { Name = "AAA", Value = "111"}, 
         new Field { Name = "BBB", Value = "222"}, 
         new Field { Name = "CCC", Value = "333"}, 
        } 
       } 
      } 
     } 
    }; 

    using (var stream = new MemoryStream()) 
    using (var reader = new StreamReader(stream)) 
    { 
     XmlSerializer serializer = new XmlSerializer(typeof(MainRequest)); 
     serializer.Serialize(stream, request); 

     stream.Seek(0, SeekOrigin.Begin); 
     var str = reader.ReadToEnd(); 
    } 
} 

をXML:

<?xml version="1.0"?> 
<MainRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Parameters> 
    <RequestSize Count="1">2</RequestSize> 
    <BatchEntry> 
     <ParameterEntry name="AAA">111</ParameterEntry> 
     <ParameterEntry name="BBB">222</ParameterEntry> 
     <ParameterEntry name="CCC">333</ParameterEntry> 
    </BatchEntry> 
    </Parameters> 
</MainRequest> 

このアプローチの利点は、あなたが複数のバッチを定義した場合、それはまだ働くだろうということです。たとえば:

var request = new MainRequest 
    { 
     Parameters = new Request 
     { 
      RequestSize = new RequestSize 
      { 
       Count = "2", 
       Value = "5", 
      }, 
      Batches = new Batch[] 
      { 
       new Batch 
       { 
        Fields = new Field[] 
        { 
         new Field { Name = "AAA", Value = "111"}, 
         new Field { Name = "BBB", Value = "222"}, 
         new Field { Name = "CCC", Value = "333"}, 
        } 
       }, 
       new Batch 
       { 
        Fields = new Field[] 
        { 
         new Field { Name = "DDD", Value = "444"}, 
         new Field { Name = "EEE", Value = "555"}, 
        } 
       } 
      } 
     } 
    }; 

が...生成されます。

<?xml version="1.0"?> 
<MainRequest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <Parameters> 
    <RequestSize Count="2">5</RequestSize> 
    <BatchEntry> 
     <ParameterEntry name="AAA">111</ParameterEntry> 
     <ParameterEntry name="BBB">222</ParameterEntry> 
     <ParameterEntry name="CCC">333</ParameterEntry> 
    </BatchEntry> 
    <BatchEntry> 
     <ParameterEntry name="DDD">444</ParameterEntry> 
     <ParameterEntry name="EEE">555</ParameterEntry> 
    </BatchEntry> 
    </Parameters> 
</MainRequest> 
0

(どうやらあなたはXmlElementXmlArrayItemを組み合わせることはできません)、その後のことができますが、「ParameterEntry」の名前を持つXmlArrayItem属性。

これは動作します:

/* No idea why this a 2-d array... It doesn't match your XML */ 
[XmlArrayItem("ParameterEntry")] 
public Field[] BatchEntry //was Batch 
0

は、何を達成しようとしていることは、ネイティブにサポートされていないことが表示されます

[XmlIgnore] 
    public Field[][] Batch 
    { 
     get 
     { 
      return _field; 
     } 
     set 
     { 
      _field = value; 
     } 
    } 
    [XmlArrayItemAttribute("ParameterEntry", IsNullable = false)] 
    public Field[] BatchEntry 
    { 
     get 
     { 
      List<Field> OneDimFields = new List<Field>(); 
      foreach(Field[] field in _field) 
      { 
       OneDimFields.AddRange(field); 
      } 
      return OneDimFields.ToArray(); 
     } 
    } 
関連する問題