C# 如何解析此XML配置文件

C# 如何解析此XML配置文件,c#,xml,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

我希望能够解析以下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>

我对XML完全陌生,但对C#还是有点陌生。我发现有一个“ExpandoObject”,它可能允许我做我提议的事情。但是,我还必须以某种方式读取值及其类型,然后动态地将其转换为正确的类型或实例化正确的类型

我尝试创建一组可序列化类来重新创建上面所示的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;
}
使用此输出:

<?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>

除此之外,这并没有产生期望的结果,因为我使用列表来保存
ConfigItem
,我遇到了一个问题,我需要将不同的数据类型添加到列表类
ConfigurationClass
,我尝试使用
configitembebase
来解决这个问题。我猜想,我需要使用
XmlReader
XmlDocument
来实现我想要的


我不确定我提出的建议是否可行,但如果可能的话,我希望有人能为我指明正确的方向,以“启动”这项努力。提前谢谢

为什么是中间对象?只需将XML加载到XmlDocument中,并使用SelectSingleNode()使用XPath进行查询。使用常规DOM方法更新它。跳过所有的序列化噪音。@WilliamWalseth谢谢你的评论。正如我所说,我对XML完全陌生,这是我的第一次尝试。我将按照您的建议查看XmlDocument和XPath。类名和标记名不必相同。如果它们不相同,则需要将标记名添加到指令[XmlElement(“ConfigItem”)]。xml不容易解析,因为您有相同的NEST标记名称。可能使用Configuration1、Configuration2、configuration3来指示不同级别的配置标记。这两次是关于在元素名称中使用#,因为它确实使XSL/XPath查询更加困难,因为您无法执行“//ConfigurationItem/ConfigurationItem”。
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;
}
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>