簡體   English   中英

如何使用LINQ讀取指定的xml節點值?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM