我有以下XML配置文件,我希望能够解析:
<?xml version="1.0" encoding="utf-8"?>
<Configuration Name="MyConfiguration" Class="ConfigClass" Description="This is the main configuration.">
<ConfigItem Name="AString" Value="1" Type="String" Description="This is a string." />
<ConfigItem Name="APath" Value="..\path" Type="Path" Description="This is a path." />
<Configuration Name="AnEnclosedConfiguration" Class="AnEnclosedClass" Description="An enclosed configuration.">
<ConfigItem Name="AnInteger" Value="6" Type="Int" Description="This is an integer value." />
<Configuration Name="AnotherEnclosedConfiguration" Class="AnotherEnclosedClass" Description="Another enclosed configuration.">
<ConfigItem Name="ARangedValue" Value="1.6" Type="Double" Min="0.1" Max="7.6" Description="This is a ranged value." />
</Configuration>
</Configuration>
</Configuration>
如您所见,有两种不同的节点: 1)&#34;配置&#34;:其中包含一组ConfigItems,还可以包含其他封闭/嵌套&#34;配置&#34;节点。 2)&#34; ConfigItem&#34;:表示变量并包含其&#34;值&#34;的属性。和&#34;键入&#34;。此外,这些可以包含不同数量的属性,例如在&#34; ARangedValue&#34;中,它包含附加属性&#34; Min&#34;和&#34; Max&#34;。
我希望能够在C#中解析这个文件,以便我可以使用thMyConfigr各自的名称访问属性中给出的值作为动态创建的数据结构的属性。例如。访问&#34; Min&#34;值&#34; ARangedValue&#34;我会做类似的事情:
double MinValue = MyConfiguration.AnEnclosedConfiguration.AnotherEnclosedConfiguration.ARangedValue.Min;
或
Path PathValue = MyConfiguration.APath.Value;
我对XML完全陌生,对C#仍然有点新鲜。我发现有一个&#34; ExpandoObject&#34;,这可能让我做我提出的建议。但是,我还必须以某种方式读取Value及其Type,然后动态地将其转换为正确的类型或实例化正确的类型。
我尝试创建一组可序列化的类来重新创建上面显示的XML结构:
public class ConfigurationClass : List<ConfigItemBase>
{
[XmlElement]
public List<ConfigItemBase> ConfigItem
{
get { return configItem; }
set { configItem = value; }
}
private List<ConfigItemBase> configItem;
}
public class ConfigItem : ConfigItemBase
{
[XmlAttribute]
public string Value
{
get { return value; }
set { this.value = value; }
}
private string value;
[XmlAttribute]
public string Description
{
get { return description; }
set { description = value; }
}
private string description;
}
[XmlInclude(typeof(ConfigItem)), XmlInclude(typeof(ConfigurationClass))]
public class ConfigItemBase
{
[XmlAttribute]
public string Description
{
get { return description; }
set { description = value; }
}
private string description;
}
然后在Main:
ConfigFile MyConfig = new ConfigFile()
{
Version = new ConfigVersion { Major = 0, Minor = 0 },
Configuration = new ConfigurationClass
{
new ConfigItem() { Description = "My first config item." },
new ConfigItem() { Description = "My second config item.", Value = "Second Value" },
}
};
serializer.Serialize(Console.Out, MyConfig);
使用此输出:
<?xml version="1.0" encoding="utf-8"?>
<ConfigFile xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<Version Major="0" Minor="0" VersionString="Major_0_Minor_0" />
<Configuration>
<ConfigItemBase xsi:type="ConfigItem" Description="My first config item." />
<ConfigItemBase xsi:type="ConfigItem" Description="My second config item." Value="Second Value" />
</Configuration>
</ConfigFile>
除了这个没有产生预期结果的事实,因为我使用List来保存ConfigItem
,我遇到了我需要将不同的数据类型添加到List-class的问题{ {1}},我尝试使用ConfigurationClass
解决这个问题。我怀疑,我需要使用ConfigItemBase
或XmlReader
来实现我想要的......
我不确定,我提出的建议是可能的,但如果是这样,我希望有人能指出我正确的方向,以及#34;跳跃开始&#34;这种努力。提前谢谢!