C# 基于属性将元素反序列化为属性

C# 基于属性将元素反序列化为属性,c#,xml,serialization,C#,Xml,Serialization,我想看看是否有一种简单的方法可以将充满元素的XML文件反序列化回一个属性类,特别是作为要附加的属性的元素属性“name”。例如,我有一个XML文件格式,如下所示: 1. 测试 42 你好,世界 我想知道是否有一种简单的方法将其反序列化回类似于此格式的类: 公共类SomeObject { [XmlElement(“数字值”)] 公共Int32 NumberValueOne{get;set;} [XmlElement(“数字值二”)] public Int32 NumberValueTwo{ge

我想看看是否有一种简单的方法可以将充满元素的XML文件反序列化回一个属性类,特别是作为要附加的属性的元素属性“name”。例如,我有一个XML文件格式,如下所示:


1.
测试
42
你好,世界
我想知道是否有一种简单的方法将其反序列化回类似于此格式的类:

公共类SomeObject
{
[XmlElement(“数字值”)]
公共Int32 NumberValueOne{get;set;}
[XmlElement(“数字值二”)]
public Int32 NumberValueTwo{get;set;}
[XmlElement(“字符串值”)]
公共字符串StringValueOne{get;set;}
[XmlElement(“字符串值二”)]
公共字符串StringValueTwo{get;set;}
}
我知道该格式不是序列化的最佳格式,但我无法更改此项目的文件格式。目前,我正在手工阅读每个元素的值,这是大量的代码,相当混乱。为了将其序列化回xml,我使用反射来绕过手工编写每个元素的需要。但我想知道是否有一个简单的方法来处理这种格式


但并非所有元素都是string/int,有些是读取后要分析的自定义类型等。

对于其中一个元素,您可以使用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 transformText=@”
";

var text=@”
1.
测试
42
你好,世界
";
请注意,
设置
名称
属性值必须应用于属性

如果您不了解xslt,只需搜索它,这里有很多示例

        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>";