根据属性将元素反序列化为属性

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,我使用反射来绕过手动写入每个元素的需求。但是我想知道是否有一种简单的方法来处理这种格式。

然而,并非所有元素都是字符串/整数,有些是自定义类型,在读取后需要进行解析等。

1个回答

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,只需搜索一下,有很多示例和参考资料。 这里提供了大量参考资料。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接