требуется справка xml дубликата узла - PullRequest
1 голос
/ 04 июля 2011

Мне нужно скопировать следующее в XML, но не знаю, как это сделать:

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

Я использую очень простой пример, чтобы объяснить, с чем мне нужна помощь.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;
}
}

Я попытался решить проблему со списком объектов, но я получаю следующее (добавление имени объекта - это мне не нужно).

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

Я уверен, что это простая проблема, но я действительно не очень разбираюсь в xml

Ответы [ 3 ]

1 голос
/ 04 июля 2011
[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 выглядит так:

<?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 голосов
/ 05 июля 2011

Кроме того, я немного изменил рефакторинг. Я создал класс с именем 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);
        }
    }
}
0 голосов
/ 05 июля 2011

Хорошо, так что с помощью 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>
...