使用c#创建XML的问题

时间:2010-06-03 06:10:32

标签: c# xml-serialization

我正在寻找一种通过xml序列化创建xml的击球手解决方案。我需要什么,我有这样的给定格式

<product Id="1">
  <name>2 1/2 X 6 PVC NIPPLE TOE SCH  80</name>
  <notes>
     <note>!--note 1---</note>
     <note>!--note 2--</note>

     ......
     </notes>

</product>

我在这里做的是什么,我创建了这样的2个类

public class product
 {
   [XmlElement("name")]
   public string Name { get; set; }

   [XmlArray("notes")]
   public List<notes> ListNotes { get; set; }
 }

 public class notes
 {
     [XmlIgnore]
     public string Note { get; set; }
  }

当我对其进行序列化时,我正在使用xml in this formate

 <product Id="1">
      <name>2 1/2 X 6 PVC NIPPLE TOE SCH  80</name>
      <notes>
        <notes>
         <note>!--note 1---</note>
         <note>!--note 2--</note>
        </notes>
      </notes>
  </product>

我不想要额外的<notes>。任何击球手解决方案来解决这个问题? 感谢


解决方案

 public class product
     {
       [XmlElement("name")]
       public string Name { get; set; }

       [XmlArray("notes")]
       public List<notes> ListNotes { get; set; }
     }

     public class notes
     {
         [XmlText]
         public string Note { get; set; }
      }




product ObjProduct = new product
  {
   Name ="Pankaj",
   notes=new List<note>()
  }

 foreach (var note in item.ListNote)
  {
    ObjProduct.notes.Add(new Highmark.BLL.Common.note { Note = EncodeTo64(note.Note) });
   }

现在使用此ObjProduct进行序列化。

3 个答案:

答案 0 :(得分:2)

试试这样:

[XmlRoot("product")]
public class Product
{
    [XmlAttribute]
    public int Id { get; set; }

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

    [XmlElement("note")]
    public List<Note> ListNotes { get; set; }
}

public class Note
{
    [XmlText]
    public string Text { get; set; }
}

class Program
{
    public static void Main()
    {
        var p = new Product
        {
            Id = 1,
            Name = "2 1/2 X 6 PVC NIPPLE TOE SCH  80",
            ListNotes = new List<Note>
            {
                new Note { Text = "!--note 1---" },
                new Note { Text = "!--note 2---" },
            }
        };
        var serializer = new XmlSerializer(p.GetType());
        serializer.Serialize(Console.Out, p);
    }
}

如果要从根节点中删除命名空间:

var ns = new XmlSerializerNamespaces();
ns.Add("", "");
serializer.Serialize(Console.Out, p, ns);

答案 1 :(得分:1)

试试这样:

class Program
{
    static void Main(string[] args)
    {
        var product = new Product() { Name = "PVC SCHOOL" };
        product.Notes = new List<note>();
        product.Notes.Add(new note() { Note = "A" });
        product.Notes.Add(new note() { Note = "B" });

        var serialer = new XmlSerializer(typeof(Product));
        using (var stream = new StreamWriter("test.txt"))
        {
            serialer.Serialize(stream, product);
        }
    }
}


public class Product
{
    [XmlElement("name")]
    public string Name { get; set; }

    [XmlArray("notes")]
    public List<note> Notes { get; set; }
}

public class note
{
    [XmlIgnore]
    public string Note { get; set; }
}

答案 2 :(得分:0)

这不能直接回答您的问题,但如果您无法解决此问题,可以创建一个Schema.xsd文件,并使用.NET的XSD工具为您生成正确的序列化类。

我已经取得了相当不错的成功。

使用模式的明显好处是在序列化之前对XML进行验证。