2011-07-04 118 views
1

我需要複製的XML以下,但不確定如何做到這一點:XML重複節點幫助需要

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

我使用了一個非常簡單的例子來解釋什麼,我需要幫助。 的XML是從解析serialisable類生成:

[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; 
} 
} 

我attemped解決與一個列表中的對象的問題,但我得到以下(添加對象名 - 這我不需要)。

<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

你要創建似乎並沒有很好的XML格式。爲什麼你需要以這種確切的形式創建它? – 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; } 
} 

後,如:

<?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?啊我看到了..每個項目的數組。無論如何格式化,以便它的順序我列出它? – 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類現在看起來像:

[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); 
     } 
    } 
}