gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 02:31:11 24 4
gpt4 key购买 nike

我想看看是否有一种简单的方法可以将充满元素的 XML 文件反序列化回一类属性,特别是将元素属性“名称”作为要附加的属性。例如,我有一个 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,我使用反射来绕过手动编写每个元素的需要。但我想知道是否有一种简单的方法来处理这种格式。

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

最佳答案

例如,您可以使用 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>";

请注意,setting name 属性值必须与应用于属性的 XmlElementAttribute 匹配。

如果您不了解 xslt,只需搜索它,那里有很多示例和 references在那里。

关于c# - 根据属性将元素反序列化为属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14093422/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com