2012-12-30 82 views
3

我正在查看是否有一種簡單的方法來將填充了元素的XML文件反序列化回屬性類,特別是元素屬性'name'作爲附加屬性。例如,我已經給了一個XML文件格式爲:根據屬性將元素反序列化爲屬性

<?xml version="1.0" encoding="utf-8"?> 
<settings> 
    <setting name="number_val_one">1</setting> 
    <setting name="string_val_one">test</setting> 
    <setting name="number_val_two">42</setting> 
    <setting name="string_val_two">hello world</setting> 
</settings> 

我想知道是否有反序列化這回一類就是類似於這種格式的簡單方法:

public class SomeObject 
{ 
    [XmlElement("number_value_one")] 
    public Int32 NumberValueOne { get; set; } 

    [XmlElement("number_value_two")] 
    public Int32 NumberValueTwo { get; set; } 

    [XmlElement("string_value_one")] 
    public String StringValueOne { get; set; } 

    [XmlElement("string_value_two")] 
    public String StringValueTwo { get; set; } 
} 

我理解格式對序列化來說並不是最好的,但我無法改變文件如何格式化爲這個項目。目前我正在手動讀取每個元素的值,這是一個很多代碼,相當混亂。將其序列化回xml我使用反射來解決手動編寫每個元素的需求。但我想知道是否有一種簡單的方法來處理這種格式。

並不是所有的元素都是字符串/ INT不過,有的正在讀等

回答

3

對於一個你可以使用XSLT通過XmlSerializer輸入字符串變換你識別數據後,解析自定義類型。

var transform = new XslCompiledTransform(); 
transform.Load(XmlReader.Create(new StringReader(transformText))); 
var memoryStream = new MemoryStream(); 
transform.Transform(new XPathDocument(new StringReader(text)),null,memoryStream); 
memoryStream.Seek(0, SeekOrigin.Begin); 
var deserializer = new XmlSerializer(typeof(SomeObject)).Deserialize(memoryStream); 

其中

  var transformText = @" 
<xsl:stylesheet version=""1.0"" xmlns:xsl=""http://www.w3.org/1999/XSL/Transform""> 
    <xsl:output method=""xml"" encoding=""utf-8"" indent=""no""/> 
    <xsl:template match=""/""> 
     <SomeObject> 
      <xsl:for-each select=""settings/setting""> 
       <xsl:element name=""{@name}""> 
        <xsl:value-of select="".""/> 
       </xsl:element> 
      </xsl:for-each> 
     </SomeObject> 
    </xsl:template> 
</xsl:stylesheet>"; 

 var text = @" 
<settings> 
    <setting name=""number_val_one"">1</setting> 
    <setting name=""string_val_one"">test</setting> 
    <setting name=""number_val_two"">42</setting> 
    <setting name=""string_val_two"">hello world</setting> 
</settings>"; 

注意settingname屬性值必須與XmlElementAttribute適用於財產馬赫。

如果你不明白xslt只是搜索它,那裏有很多的例子和references

+0

非常好,完全按照我需要的那樣工作。謝謝。 :) – atom0s

相關問題