C# 如何使用LINQ读取指定的xml节点值?
当我指定VM名称值时,我希望从附加的xml文件中读取浏览器和语言值。我已经尝试运行下面的方法很多次了,但是我不断地得到错误。有谁能为我的代码提出一个修复方案或者一个更好的方法来获得我想要的东西吗? 非常感谢。 J 可以这样称呼: ReadVMSettings(“EN2008”、“来宾”、“语言”)C# 如何使用LINQ读取指定的xml节点值?,c#,linq,xml-parsing,C#,Linq,Xml Parsing,当我指定VM名称值时,我希望从附加的xml文件中读取浏览器和语言值。我已经尝试运行下面的方法很多次了,但是我不断地得到错误。有谁能为我的代码提出一个修复方案或者一个更好的方法来获得我想要的东西吗? 非常感谢。 J 可以这样称呼: ReadVMSettings(“EN2008”、“来宾”、“语言”) Thnaks.这应该返回您在示例中所寻找的语言值 string val = SettingFromXML( @"<!--VM settings on ESX Server-->
Thnaks.这应该返回您在示例中所寻找的语言值
string val = SettingFromXML(
@"<!--VM settings on ESX Server-->
<VM name=""DE-2K8"" language=""de"" powerOn=""true"">
<vmClients>
<vmClient name=""ITXP"" language=""it""/>
</vmClients>
<guest>
<browser value = ""firefox""/>
<language value = ""de""/>
</guest>
</VM>
<VM name=""EN2008"" language=""en"" powerOn=""true"">
<vmClients>
<vmClient name=""IT-2K8R2ENT64X"" language=""it""/>
</vmClients>
<guest>
<browser value = ""chrome""/>
<language value = ""en""/>
</guest>
</VM>", "EN2008", "guest", "language"
);
MessageBox.Show(val);
public static string SettingFromXML(string xml, string systemName, string section, string name) {
xml = "<VMSettings>" + xml + "</VMSettings>"; // wrap XML in root node to deal with multiple root node exception
using (MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(xml))) {
XDocument xDoc = XDocument.Load(ms);
return xDoc.Descendants("VMSettings")
.Descendants("VM").First(el1 => el1.Attribute("name").Value == systemName)
.Descendants().First(el2 => el2.Name == section)
.Descendants().First(el3 => el3.Name == name).Attribute("value").Value;
}
}
string val=SettingFromXML(
@"
“,“EN2008”,“来宾”,“语言”
);
MessageBox.Show(val);
公共静态字符串设置FromXML(字符串xml、字符串系统名称、字符串节、字符串名称){
xml=”“+xml+”“;//在根节点中包装xml以处理多个根节点异常
使用(MemoryStream ms=new MemoryStream(Encoding.Default.GetBytes(xml))){
XDocument xDoc=XDocument.Load(毫秒);
返回xDoc.substands(“VMSettings”)
.subjects(“VM”).First(el1=>el1.Attribute(“name”).Value==systemName)
.subjects().First(el2=>el2.Name==section)
.subjects().First(el3=>el3.Name==Name).Attribute(“value”).value;
}
}
您的xml模式中缺少根元素
您应该像
<?xml version="1.0" encoding="utf-8" ?>
<automationSettings> //missing root element
<VM name="DE-2K8" language="de" powerOn="true">
<vmClients>
<vmClient name="ITXP" language="it"/>
</vmClients>
<guest>
<browser value = "firefox"/>
<language value = "de"/>
</guest>
</VM>
<VM name="EN2008" language="en" powerOn="true">
<vmClients>
<vmClient name="IT-2K8R2ENT64X" language="it"/>
</vmClients>
<guest>
<browser value = "chrome"/>
<language value = "en"/>
</guest>
</VM>
</automationSettings>
更具体一点-你会遇到什么错误?谢谢。非常感谢你的建议,但我宁愿坚持我所展示的方式,而不是在中阅读整个XML文件。我想问题出在我的LINQ代码中,我没有正确调用某些东西。太棒了,谢谢Shujaat。我确实包含了根目录,但由于某种原因,它没有显示出来。我使用了你的代码,现在它可以正常工作了。再次感谢。
string val = SettingFromXML(
@"<!--VM settings on ESX Server-->
<VM name=""DE-2K8"" language=""de"" powerOn=""true"">
<vmClients>
<vmClient name=""ITXP"" language=""it""/>
</vmClients>
<guest>
<browser value = ""firefox""/>
<language value = ""de""/>
</guest>
</VM>
<VM name=""EN2008"" language=""en"" powerOn=""true"">
<vmClients>
<vmClient name=""IT-2K8R2ENT64X"" language=""it""/>
</vmClients>
<guest>
<browser value = ""chrome""/>
<language value = ""en""/>
</guest>
</VM>", "EN2008", "guest", "language"
);
MessageBox.Show(val);
public static string SettingFromXML(string xml, string systemName, string section, string name) {
xml = "<VMSettings>" + xml + "</VMSettings>"; // wrap XML in root node to deal with multiple root node exception
using (MemoryStream ms = new MemoryStream(Encoding.Default.GetBytes(xml))) {
XDocument xDoc = XDocument.Load(ms);
return xDoc.Descendants("VMSettings")
.Descendants("VM").First(el1 => el1.Attribute("name").Value == systemName)
.Descendants().First(el2 => el2.Name == section)
.Descendants().First(el3 => el3.Name == name).Attribute("value").Value;
}
}
<?xml version="1.0" encoding="utf-8" ?>
<automationSettings> //missing root element
<VM name="DE-2K8" language="de" powerOn="true">
<vmClients>
<vmClient name="ITXP" language="it"/>
</vmClients>
<guest>
<browser value = "firefox"/>
<language value = "de"/>
</guest>
</VM>
<VM name="EN2008" language="en" powerOn="true">
<vmClients>
<vmClient name="IT-2K8R2ENT64X" language="it"/>
</vmClients>
<guest>
<browser value = "chrome"/>
<language value = "en"/>
</guest>
</VM>
</automationSettings>
static void Main(string[] args)
{
string value = ReadVMSettings("EN2008", "guest", "browser");
}
public static string ReadVMSettings(string systemName, string section, string name)
{
string systemsFilePath = @"C:\Text.xml";
Console.WriteLine("Systems.xml path is: " + systemsFilePath);
XDocument systemXML = XDocument.Load(systemsFilePath);
var result = from vm in systemXML.Root.Descendants("VM")
where vm.Attribute("name").Value == systemName
select vm.Element(section).Element(name).Attribute("value").ToString();
return result.FirstOrDefault().ToString();
}