将c#放在xml中

时间:2014-02-01 17:34:45

标签: c# xml

我正在使用WinForms。我有一个XML文档,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<MarcusXMLFile xmlns:Responses="http://www.rewardstrike.com/XMLFile1.xml">
  <response>
    <greatmood>
      <yes>
        <replytocommand>
          <answer>Yes.</answer>
          <answer>Yes, sir.</answer>
          <answer>Settings.Default.User</answer>
        </replytocommand>
      </yes>
    </greatmood>
  </response>
</MarcusXMLFile>

要阅读此xml文档,我使用:

private void Responses()
    {
        string query = String.Format("http://www.rewardstrike.com/XMLFile1.xml");
        XmlDocument Responses = new XmlDocument();
        Responses.Load(query);

        XmlNode channel = Responses.SelectSingleNode("MarcusXMLFile");



        if (QEvent == "yesreplytocommand")
        {

            XmlNodeList yesreplytocommand = Responses.SelectNodes("MarcusXMLFile/response/greatmood/yes/replytocommand/answer");
            foreach (XmlNode ans in yesreplytocommand
                        .Cast<XmlNode>()
                        .OrderBy(elem => Guid.NewGuid()))
                    {
                        response = ans.InnerText;
                    }
        }
    }

然后显示:

QEvent = "yesreplytocommand";
Responses();
Console.WriteLine(response);

我的问题是当它获取Settings.Default.User并显示它时,我希望它将其显示为c#代码,以便它实际从应用程序获取值。现在它实际上显示“Settings.Default.User”。我该怎么做?

2 个答案:

答案 0 :(得分:3)

首先,您需要一种方法来识别哪些条目是文字,哪些是表达式。您可以通过向XML节点添加属性来实现:

<?xml version="1.0" encoding="utf-8" ?>
<MarcusXMLFile xmlns:Responses="http://www.rewardstrike.com/XMLFile1.xml">
  <response>
    <greatmood>
      <yes>
        <replytocommand>
          <answer>Yes.</answer>
          <answer>Yes, sir.</answer>
          <answer expression="true">DefaultSettings.User</answer>
        </replytocommand>
      </yes>
    </greatmood>
  </response>
</MarcusXMLFile>

基于此,您可以修改解析代码,直接使用XML中的值或者对其进行评估:

foreach (XmlNode ans in yesreplytocommand
    .Cast<XmlNode>()
    .OrderBy(elem => Guid.NewGuid()))
        {
            var attribute = ans.Attributes["expression"];
            if (attribute != null && attribute.Value == "true")
            {
                Console.WriteLine(Evaluate(ans.InnerText));
            }
            else
            {
                Console.WriteLine(ans.InnerText);
            }
        }

仍然存在评估该表达式的问题。从C#开始,没有简单的内置方法。但你可以使用Dynamic Expresso。这就是Evaluate方法的样子:

public string Evaluate(string expression)
{
    var interpreter = new Interpreter();
    interpreter.SetVariable("DefaultSettings", Settings.Default);
    return interpreter.Eval<string>(expression);
}

如您所见,您仍然需要自己定义表达式变量。要使上述工作正常,您必须在XML中使用DefaultSettings.User而不是Settings.Default.User。我已经在答案开始时对我的示例XML进行了更改。

答案 1 :(得分:0)

您应该查看XML序列化。

它的工作方式非常基础,它可以转换结构或类,如下所示:

struct Foo
{
    int bar = 0;
    Vector2 obj = new Vector2(10, 50);
}

进入这个:

<?xml version="1.0" ?> 
<Foo xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"">
<bar>0</bar>
<obj>
    <X>10</X>
    <Y>50</Y>
</ojb>
</Foo>

反之亦然。
用于加载和保存代码的方法如下所示:

public static void Save(string filepath, Foo foobject)
{
    XmlSerializer serializer = new XmlSerializer(typeof(Foo));
    using (Stream stream = File.OpenWrite(filepath))
    {
        serializer.Serialize(stream, foobject);
    }
}

public static Foo Load(string filepath)
{
    Foo myFoo;
    XmlSerializer serializer = new XmlSerializer(typeof(Foo));
    using (Stream stream = File.OpenRead(filepath))
    {
        myFoo = (Foo)serializer.Deserialize(stream);
    }
}

它将xml代码转换为c#代码,以及其他方式。 它不能转换方法,但它可以转换大多数属性和类。