簡體   English   中英

在新元素中將屬性序列化為Xml屬性

[英]Serialize Property as Xml Attribute in new Element

我有一個簡單的課程

public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }

    public ICollection<Address> AllAddress { get; set; }
}

public class Address
{
    public string  Street { get; set; }
}

如果我序列化People實例使用默認的XmlSerializer,那么我將得到

<Person xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Id>2</Id>
    <Name>FIO FIO IFO</Name>
    <Address>
        <Street>Golden Gate</Street>
    </Address>
</Person>

我如何得到這個結果?

<struct n="People">
     <attr n="id">2</attr >
     <attr n="name">FIO FIO IFO</attr >
     <struct n="Address">
         <attr n="street">Golden Gate</attr>
     </struct >
</struct>

看來您必須將xml轉換為自定義格式,因此必須在Person類對象中實現IXmlSerializable接口。

public class Person : IXmlSerializable
{
    public int Id { get; set; }
    public string Name { get; set; }
    public Address Address { get; set; }

    public XmlSchema GetSchema() { throw new NotImplementedException(); }

    public void ReadXml(XmlReader reader)
    {
        while (reader.Read())
        {
            if (reader.Name == "attr" && reader.GetAttribute("n") == "id")
                Id = Convert.ToInt32(reader.ReadInnerXml());

            if (reader.Name == "attr" && reader.GetAttribute("n") == "name")
                Name = reader.ReadInnerXml();

            if (reader.Name == "attr" && reader.GetAttribute("n") == "street")
                Address = new Address { Street = reader.ReadInnerXml() };
        }
    }

    public void WriteXml(XmlWriter writer)
    {
        //Start "struct"
        writer.WriteStartElement("struct");
        writer.WriteAttributeString("n", "People");

        writer.WriteStartElement("attr");
        writer.WriteAttributeString("n", "id");
        writer.WriteString(Id.ToString());
        writer.WriteEndElement();

        writer.WriteStartElement("attr");
        writer.WriteAttributeString("n", "name");
        writer.WriteString(Name.ToString());
        writer.WriteEndElement();

        //Start inner "struct"
        writer.WriteStartElement("struct");
        writer.WriteAttributeString("n", "Address");

        writer.WriteStartElement("attr");
        writer.WriteAttributeString("n", "street");
        writer.WriteString(Address.Street.ToString());
        writer.WriteEndElement();

        //End inner "struct"
        writer.WriteEndElement();

        //End "struct"
        writer.WriteEndElement();
    }
}

您可以像這樣對XML進行序列化和反序列化。

Person person = new Person
{
    Id = 2,
    Name = "FIO FIO IFO",
    Address = new Address { Street = "Golden Gate" }
};

//--------------------Serialization----------------------------

XmlSerializer serializer = new XmlSerializer(person.GetType());
using (StreamWriter writer = new StreamWriter(@"Path to xml file"))
{
    serializer.Serialize(writer, person);
}

//--------------------Deserialization----------------------------

using (StringReader stringReader = new StringReader(File.ReadAllText(@"Path to same xml file that generated by above serializer")))
{
    person = (Person)serializer.Deserialize(stringReader);

    Console.WriteLine("Id: " + person.Id);
    Console.WriteLine("Name: " + person.Name);
    Console.WriteLine("Street: " + person.Address.Street);

    Console.ReadLine();
}

序列化輸出:

在此處輸入圖片說明

反序列化的輸出:

在此處輸入圖片說明


替代

您還可以創建一個自定義方法來讀取和寫入xml。

1)寫

public static void WriteXml(Person person, string path)
{
    using (XmlWriter writer = XmlWriter.Create(path))
    {
        //Start "struct"
        writer.WriteStartElement("struct");
        writer.WriteAttributeString("n", "People");

        writer.WriteStartElement("attr");
        writer.WriteAttributeString("n", "id");
        writer.WriteString(person.Id.ToString());
        writer.WriteEndElement();

        writer.WriteStartElement("attr");
        writer.WriteAttributeString("n", "name");
        writer.WriteString(person.Name.ToString());
        writer.WriteEndElement();

        //Start inner "struct"
        writer.WriteStartElement("struct");
        writer.WriteAttributeString("n", "Address");

        writer.WriteStartElement("attr");
        writer.WriteAttributeString("n", "street");
        writer.WriteString(person.Address.Street.ToString());
        writer.WriteEndElement();

        //End inner "struct"
        writer.WriteEndElement();

        //End "struct"
        writer.WriteEndElement();
    }
}

用法:

Person person = new Person
{
    Id = 2,
    Name = "FIO FIO IFO",
    Address = new Address { Street = "Golden Gate" }
};

WriteXml(person, @"Path to xml file");

2)閱讀

public static Person ReadXml(string path)
{
    Person person = new Person();

    using (XmlReader reader = XmlReader.Create(path))
    {
        while (reader.Read())
        {
            if (reader.Name == "attr" && reader.GetAttribute("n") == "id")
                person.Id = Convert.ToInt32(reader.ReadInnerXml());

            if (reader.Name == "attr" && reader.GetAttribute("n") == "name")
                person.Name = reader.ReadInnerXml();

            if (reader.Name == "attr" && reader.GetAttribute("n") == "street")
                person.Address = new Address { Street = reader.ReadInnerXml() };
        }
    }

    return person;
}

用法:

Person result = ReadXml(@"Path to same xml file that generated by above serializer");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM