使用xml元素/属性进行XML反序列化

时间:2011-10-17 13:20:09

标签: c# .net xml xml-serialization

需要您的帮助来设置XML反序列化的xml属性。

这是我的输入xml:

<form>
<question id="QnA">
<answer>AnswerforA</answer>
</question>
<question id="QnB">
<answer>AnswerforB</answer>
</question>
<question id="QnC">
<answer>AnswerforC</answer>
</question>
</form>

每个问题元素标记的ID对应于一个类属性,其值是相应答案元素的innertext。

.cs文件看起来像

 public class Test
{

   private string qnaAns;    
   private string qnbAns;   
   private string qncAns;   

    public string QnA
    {
    get{ return qnaAns;}
    set{qnaAns = value;}
    }

    public string QnB
    {
    get{ return qnbAns;}
    set{qnbAns = value;}
    }

    public string QnC
    {
    get{ return qncAns;}
    set{qncAns = value;}
    }
}

我使用以下代码进行反序列化

XmlSerializer ser = new XmlSerializer(typeof(Test));

XmlReader xr = new xmlReader(inputxml);

Test t = ser.Deserialize(xr) as Test;

请让我知道如何设置Test类的XML元素/属性来实现此目的。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

 [XmlRoot("form")]
    public class Form
    {
        [XmlElement("question")]
        public List<Question> Questions { get; set; }

        public Form()
        {
            Questions = new List<Question>();
        }
    }
    public struct Question
    {
        [XmlAttribute("id")]
        public string ID { get; set; }

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

然后要序列化,我使用以下扩展名:

public static bool XmlSerialize<T>(this T item, string fileName) 
        { 
            return item.XmlSerialize(fileName, true); 
        } 
        public static bool XmlSerialize<T>(this T item, string fileName, bool removeNamespaces) 
        { 
            object locker = new object(); 

            XmlSerializerNamespaces xmlns = new XmlSerializerNamespaces(); 
            xmlns.Add(string.Empty, string.Empty); 

            XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 

            XmlWriterSettings settings = new XmlWriterSettings(); 
            settings.Indent = true; 
            settings.OmitXmlDeclaration = true; 

            lock (locker) 
            { 
                using (XmlWriter writer = XmlWriter.Create(fileName, settings)) 
                { 
                    if (removeNamespaces) 
                    { 
                        xmlSerializer.Serialize(writer, item, xmlns); 
                    } 
                    else { xmlSerializer.Serialize(writer, item); } 

                    writer.Close(); 
                } 
            } 

            return true; 
        } 
        public static T XmlDeserialize<T>(this string s) 
        { 
            object locker = new object(); 
            StringReader stringReader = new StringReader(s); 
            XmlTextReader reader = new XmlTextReader(stringReader); 
            try 
            { 
                XmlSerializer xmlSerializer = new XmlSerializer(typeof(T)); 
                lock (locker) 
                { 
                    T item = (T)xmlSerializer.Deserialize(reader); 
                    reader.Close(); 
                    return item; 
                } 
            } 
            finally 
            { 
                if (reader != null) 
                { reader.Close(); } 
            } 
        } 
        public static T XmlDeserialize<T>(this FileInfo fileInfo) 
        { 
            string xml = string.Empty; 
            using (FileStream fs = new FileStream(fileInfo.FullName, FileMode.Open, FileAccess.Read)) 
            { 
                using (StreamReader sr = new StreamReader(fs)) 
                { 
                    return sr.ReadToEnd().XmlDeserialize<T>(); 
                } 
            } 
        } 

希望这有帮助。

PS - 扩展来自我在codeproject上的库:http://www.codeproject.com/KB/dotnet/MBGExtensionsLibrary.aspx