0

假设我的代码有一个这样定义的类:

class test{
    bool var;
    public test(){}
}

在我的主函数中,我创建了一个对象,并将 var 设置为 true。

之后,我解析了一些包含以下内容的 XML 文件:

<param name="var" value="false"/>

我读到 var 必须为 false,并将其设置为 false。

这很好,但问题是可维护性。维护这一点似乎很麻烦,因为如果有人更改代码中的变量名,他们将不得不更改所有 XML 文件。

有没有一些简单的方法来解决这个问题?或者至少是一种简单的维护方法?我现在唯一能想到的就是一些元脚本,它会以某种方式编辑 XML 和 c# 代码,但这似乎需要做很多工作,而且老实说相当 hacky。

4

3 回答 3

0

下面的代码示例可能对您有所帮助。

不用在 XML 中声明变量“名称”和“值”,而是使用 .NET 提供的 XML 序列化将 XML 解析为适当的变量。随意从您的 XML 中完全删除“名称”,或者将其变成一种设备,以清楚地表达值的目的。我已更新您的 XML 以使用元素(更具可读性)而不是以下属性:

XML 示例

<Test>
    <Params>
        <Param>
            <Name>Meaningful Parameter Name</Name>
            <Value>1</Value>
        </Param>
        <Param>
            <Name>Meaningful Parameter Name2</Name>
            <Value>0</Value>
        </Param>
    </Params>
</Test>

在代码中,我们使用 xml 序列化将 XML 元素分配给变量。如您所见,Param 类将包含一个字符串名称和一个布尔值,它们将从 XML 元素“Name”和“Value”中读取。这允许您更改变量名称,而不必担心更新 XML 以反映它们。如果您改变主意并想将 XML 中的“Value”重命名为不同的名称,则只需使用 XML 中定义的新名称在一处[XmlElement("Value")]更新代码。简单的!:)

祝你好运!

代码示例

using System;
using System.Collections.Generic;
using System.IO;
using System.Xml.Linq;
using System.Xml.Serialization;

namespace ConsoleApplication1
{
    public class Program
    {
        private static void Main(string[] args)
        {
            string testXML = @"<Test>
                                    <Params>
                                        <Param>
                                            <Name>Meaningful Parameter Name</Name>
                                            <Value>1</Value>
                                        </Param>
                                        <Param>
                                            <Name>Meaningful Parameter Name2</Name>
                                            <Value>0</Value>
                                        </Param>
                                    </Params>
                               </Test>";

            XDocument doc = XDocument.Parse(testXML);
            XmlSerializer serializer = new XmlSerializer(typeof (Test));
            Test testDeserialized = (Test) serializer.Deserialize(doc.CreateReader());

            foreach (Param param in testDeserialized.Params)
            {
                Console.WriteLine("Name: " + param.Name + ", Value: " + param.Value);
            }

            Console.ReadLine();
        }
    }

    [XmlRoot]
    public class Test
    {
        [XmlArray("Params")]
        [XmlArrayItem("Param", typeof (Param))]
        public Param[] Params { get; set; }
    }

    public class Param
    {
        [XmlElement("Name")]
        public string Name { get; set; }

        [XmlElement("Value")]
        public bool Value { get; set; }
    }
}
于 2013-06-06T04:53:54.877 回答
0

NetReflector擅长于此。CruiseControl.net 使用它从 xml 配置创建对象。

于 2013-06-06T05:36:38.310 回答
0

你有几个选择:

  • 如果您不控制 XML 文件的格式,则可以编写一些管道代码,将 XML 的属性名称读取到您的属性名称中。没有技术原因它们必须相同。

  • 如果您在运行时生成 XML 文件,则可以使用反射来获取属性名称并相应地设置 XML 文件属性名称。它们将始终以这种方式同步。

  • 如果您在编译时创建 XML 文件并且您是 Visual Studio 用户,我建议您查看T4 Templates。它们是一种以一致、可重用和强类型方式生成文件的好工具。

于 2013-06-06T04:29:04.043 回答