我有以下xml片段:
<Configuration>
<Config name="SendToAddresses"></Config>
<Config name="CCToAddresses"></Config>
<Config name="BCCAddresses"></Config>
</Configuration>
我想要的是deSerialize到一个强类型的类,包含值对(name | value)的数组中的所有config项。
答案 0 :(得分:4)
class Program
{
static void Main(string[] args)
{
XmlSerializer serializer = new XmlSerializer(typeof(Configuration));
var xml =
@"<Configuration>
<Config name=""SendToAddresses"">some value</Config>
<Config name=""CCToAddresses""></Config>
<Config name=""BCCAddresses""></Config>
</Configuration>";
using (var reader = new StringReader(xml))
{
var configuration = (Configuration)serializer.Deserialize(reader);
}
}
}
public class Configuration
{
[XmlElement(ElementName="Config")]
public Config[] Configs { get; set; }
}
public class Config
{
[XmlAttribute(AttributeName = "name")]
public string Name { get; set; }
[XmlText]
public string Value { get; set; }
}
答案 1 :(得分:0)
为了获得强类型,您必须创建XML模式 - 一个XSD文件,其中包含每个xml节点的定义和类型。 查看MSDN documentation了解相关信息。
答案 2 :(得分:0)
这就是你要找的东西:
[XmlRoot("Configuration")]
public class Configuration
{
[XmlElement("Config")]
public List<Config> Configs { get; set; }
}
public class Config
{
[XmlAttribute("name")]
public string Name { get; set; }
[XmlText]
public string Value { get; set; }
public Config() { }
}
// ...
XmlSerializer s = new XmlSerializer(typeof(Configuration));
Configuration conf = (Configuration)s.Deserialize(new StringReader("INSERTXMLHERE"));
foreach (var config in conf.Configs)
{
Console.WriteLine("{0} = {1}", config.Name, config.Value);
}
答案 3 :(得分:0)
没有必要将xml文件反序列化为强类型对象以获得配置数组。
如果您能负担得起将xml文件更改为:
<Configuration>
<SendToAddresses></SendToAddresses>
<CCToAddresses></CCToAddresses>
<BCCAddresses></BCCAddresses>
</Configuration>
按照以下简单步骤操作:
使用XSD.exe,您将在15分钟内设置并拥有一个很好的强类型配置对象。
答案 4 :(得分:0)
我认为您尝试解决的问题已经在System.Configuration命名空间中解决了?
我认为Jon Rista在Code Project上的this article概述了如何使用Configuration类,并且可以帮助您完成所需的工作。
如果这不完全符合您的需要,您可能需要考虑为项目制作序列化程序集,以便创建包含配置类的程序集。
每当我在编译期间没有创建反序列化器和序列化器类时,我遇到了反序列化和序列化的问题。随着时间的推移,您会发现在运行时创建的XmlSerialization类并不总是创建或可用,并且您将遇到错误。
最简单的方法是创建一个新的Assembly项目并添加一个带有公共读/写属性的Serializeable()类。然后你可以使用sgen在Post Build事件中创建一个序列化程序集,就像这样......
sgen / a:$(TargetFileName)/ force / verbose
然后你需要在你想要执行序列化的任何程序集中引用你的Serializable程序集。只要你的bin或探测路径中有AssemblyName.Serializable.Serializers可用,那么动态程序集就不会在运行时创建,您不会遇到错误。
完成后,您将能够序列化和反序列化序列化程序集中包含的类型。
...串行化
IsolatedStorageFile isolatedStorage = IsolatedStorageFile.GetUserStoreForAssembly();
using (IsolatedStorageFileStream stream = new
IsolatedStorageFileStream(key, FileMode.Create, isolatedStorage))
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
serializer.Serialize(stream, value);
}
反序列化
using (IsolatedStorageFile isolatedStorage =
IsolatedStorageFile.GetUserStoreForAssembly())
{
using (IsolatedStorageFileStream stream =
new IsolatedStorageFileStream(
key, FileMode.OpenOrCreate, FileAccess.ReadWrite, isolatedStorage))
{
if (stream.Length > 0)
{
XmlSerializer serializer = new XmlSerializer(typeof(T));
return (T)serializer.Deserialize(stream);
}
else
{
return default(T);
}
}
}