我正在使用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”。我该怎么做?
答案 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#代码,以及其他方式。 它不能转换方法,但它可以转换大多数属性和类。