如何解析此XML配置文件

时间:2016-02-05 08:54:20

标签: c# xml

我有以下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解决这个问题。我怀疑,我需要使用ConfigItemBaseXmlReader来实现我想要的......

我不确定,我提出的建议是可能的,但如果是这样,我希望有人能指出我正确的方向,以及#34;跳跃开始&#34;这种努力。提前谢谢!

0 个答案:

没有答案