[英]How to read a specified xml node value using LINQ?
指定虛擬機名稱值時,我想從附加的xml文件中讀取瀏覽器和語言值。 我試過多次運行以下方法,但我不斷出錯。 有人可以建議對我的代碼進行修復,還是一種獲取我想要的更好的方法? 非常感謝。 J.
<?xml version='1.0' encoding='utf-8'?>
<automationSettings>
<!--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>
</automationSettings>
這是我用來嘗試獲取瀏覽器或語言值的代碼:
public static string ReadVMSettings(string systemName, string section, string name)
{
try
{
systemsFilePath = @"C:\Text.xml";
Console.WriteLine("Systems.xml path is: " + systemsFilePath);
XDocument systemXML = XDocument.Load(systemsFilePath);
var result = from vm in systemXML.Descendants("automationSettings")
.Descendants("VM")
.Descendants(section)
where vm.Attribute("name").Value == systemName
select vm.Element(name).Attribute("value").Value;
return result.First();
}
catch (Exception ex)
{
Console.WriteLine("ReadVMSettings exception: " + ex.ToString());
return string.Empty;
}
}
這樣稱呼:ReadVMSettings(“ EN2008”,“ guest”,“ language”);
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;
}
}
您在xml模式中缺少根元素
你的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>
干得好 ...
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.