2013-12-09 59 views
1

当我指定VM名称值时,我想从附加的xml文件中读取浏览器和语言值。我试着运行下面的方法一段时间,但我不断收到错误。任何人都可以建议我的代码修复或更好的方式来获得我想要的? Thnaks非常。 J.如何使用LINQ读取指定的xml节点值?

<?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”, “客人”, “语言”);

Thnaks。

+0

更具体 - 什么你有错误吗?谢谢。 – mayabelle

回答

1

你缺少根元素在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(); 

    } 
+0

非常棒,感谢Shujaat。我确实包含了根,但有些原因,没有显示。我使用你的代码,现在按预期工作。再次感谢。 – bearaman

+0

My Pleasure bro .. –

0

这应该会返回您在示例中正在寻找的语言值。

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;     
    }     
} 
+0

非常感谢您的建议,但我宁愿坚持我所展示的方式,而不是阅读整个XML文件。我认为问题出在我的LINQ代码中,我没有正确地调用某些东西。 – bearaman