- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我想看看是否有一种简单的方法可以将充满元素的 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/
出于好奇,我尝试了一些原型(prototype)制作,但似乎只允许在第一个位置使用子例程的原型(prototype) &。 当我写作时 sub test (&$$) { do_somethin
我需要开发一个类似于 Android Play 商店应用程序或类似 this app 的应用程序.我阅读了很多教程,发现几乎每个教程都有与 this one 类似的例子。 . 我已经开始使用我的应用程
考虑一个表示“事件之间的时间”的列: (5, 40, 3, 6, 0, 9, 0, 4, 5, 18, 2, 4, 3, 2) 我想将这些分组到 30 个桶中,但桶会重置。期望的结果: (0, 1,
我是一名优秀的程序员,十分优秀!