2013-12-09 5 views
1

Я хотел бы прочитать значения браузера и языка из прикрепленного файла xml, когда я укажу значение имени виртуальной машины. Я попытался запустить метод ниже, но я продолжаю получать ошибки. Может ли кто-нибудь предложить исправление для моего кода или лучший способ получить то, что я хочу? Thnaks очень много. J.Как читать заданное значение узла xml с помощью LINQ?

<?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

Смежные вопросы