2011-07-04 6 views
1

を必要としていました。私は、リストオブジェクトの問題を解決するためにattempedXML複製ノードのヘルプは、私がXMLに次のように複製する必要があるが、これを行う方法がわからない

[Serializable] 
[XmlRoot("FAMILY")] 
public class FamilyBlock 
{ 
public string NAME { get; set; } 
public int AGE { get; set; } 
public DateTime? DOB { get; set; } 

public FamilyBlock(string name, int age, DateTime? dob) 
{ 
NAME = name; 
AGE = age; 
DOB = dob; 
} 
} 

しかし、私は、次の(オブジェクト名の追加を - これは私が必要としない)を取得: XMLはserialisableクラスを解析から生成されます。

<FAMILY> 
<MEMBER> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
</MEMBER> 
<MEMBER> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
</MEMBER> 
<MEMBER> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
</MEMBER> 
<MEMBER> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
</MEMBER> 
</FAMILY> 

私はこれは単純な問題であると確信しているが、私は実際にXMLシリアル化がどのように見えるの後のxml

+0

。なぜあなたはこの正確な形でそれを作成する必要がありますか? – svick

+0

ええ - そのサードパーティから。 – nologo

答えて

1
[XmlRoot("Family")] 
public class FamilyBlock 
{ 
    [XmlElement("NAME")] 
    public string[] NAME { get; set; } 
    [XmlElement("AGE")] 
    public int[] AGE { get; set; } 
    [XmlElement("DOB")] 
    public DateTime?[] DOB { get; set; } 
} 

の多くの知識を持っていけない:[OK]をので、私がやったこと

<?xml version="1.0"?> 
<Family xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <NAME>a</NAME> 
    <NAME>s</NAME> 
    <AGE>1</AGE> 
    <AGE>3</AGE> 
    <DOB>2011-07-04T13:51:20.6757286+03:00</DOB> 
    <DOB xsi:nil="true" /> 
</Family> 
+0

注文が必要な場合は、ISerializableインターフェイスを実装する必要があります – Nagg

+0

次に、コンストラクタでNameを2回呼び出す方法はありますか?ああ、私は見る。各項目の配列。とにかく私はそれを記載順にそれをフォーマットするには? – nologo

+0

私はあなたが(XmlWritter \ Linq2xmlの助けを借りて)独自のシリアライザを作成し、正しい順序でノードを配置する方がよいと思います... – Nagg

0

Naggの助けを借りてIXmlSerializableインターフェイスを実装することでした。

[Serializable] 
[XmlRoot("FAMILY")] 
public class FamilyBlock : IXmlSerializable 
{ 
    [XmlElement("NAME")] 
    public List<string> NAME { get; set; } 
    [XmlElement("AGE")] 
    public List<int> AGE { get; set; } 
    [XmlElement("DOB")] 
    public List<DateTime?> DOB { get; set; } 

    public FamilyBlock(string name, int age, DateTime? dob) 
    { 
     NAME = name; 
     AGE = age; 
     DOB = dob; 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
     for (int i = 0; i < this.NAME.Count; i++) 
     { 
      writer.WriteElementString("NAME ", this.NAME[i]); 
      writer.WriteElementString("AGE", this.AGE[i]); 
      writer.WriteElementString("DOB", this.DOB[i]); 
     } 

    } 
} 

正しいアプローチでない場合は、気軽に更新してくださいが、これは私のために働きます。 、メソッドに次のようにも継承されますのでご注意ください。

public XmlSchema GetSchema() 
{ 
    throw new NotImplementedException(); 
} 
public void ReadXml(XmlReader reader) 
{ 
    throw new NotImplementedException(); 
} 

結果:

<FAMILY> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
<NAME> 
<AGE> 
<DATEOFBIRTH> 
</FAMILY> 
0

はまた、私は少しそれをリファクタリング。私はFamilyMemberという名前のクラスを作成しました:

public class FamilyMember 
{ 
    public FamilyMember() 
    { 

    } 
    public FamilyMember(string name, string age, string dob) 
    { 
     NAME =name; 
     // etc etc 
    } 

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

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

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

ので、私は今シリアライズしたい私のXMLクラスは、次のようになります。あなたが作成しようとしているXML形式は非常に良いではないよう

[Serializable] 
[XmlRoot("RESY")] 
public class FamilyBlock: IXmlSerializable 
{ 
    public List<FamilyMember> FAMILYMEMBERS{ get; set; } 

    public FamilyBlock() 
    { 

    } 

    public FamilyBlock(string name, int age, DateTime? dob) 
    { 
     var familyMembers = new List<FamilyMember> // etc etc 
    .... 
    } 

    public void WriteXml(XmlWriter writer) 
    { 

     foreach (var item in FAMILYMEMBERS) 
     { 
      writer.WriteElementString("NAME", item.NAME); 
      writer.WriteElementString("AGE", item.AGE); 
      writer.WriteElementString("DOB", item.DOB); 
     } 
    } 
}