2017-05-18 1 views
0

J'ai fichier XML suivant:Obtenir des valeurs spécifiques de XML avec des valeurs ID

<root> 
    <location id='IBM'> 
     <property name='locale' value='en-EN' /> 
     <property name='path' value='c:\program files\IBM' /> 
     <property name='option' value='licence' /> 
     <package kind='offering' name='IBM tools'> 
      <property name='cic.name' value='IBM Studio'/> 
      <property name='cic.version' value='13.4'/> 
     </package> 
    </location> 
    <location id='Microsoft'> 
     <property name='locale' value='en-EN' /> 
     <property name='path' value='c:\program files\MS' /> 
     <property name='option' value='licence' /> 
     <package kind='offering' name='Microsoft'> 
      <property name='cic.name' value='Windows XP'/> 
      <property name='cic.version' value='10.3.2'/> 
     </package> 
    </location> 
</root> 

Comment puis-je obtenir ces valeurs de cic.name et cic.version dans cette structure XML:

IBM studio 13,4 Windows XP 10.3.2

J'ai essayé

XElement roots = XElement.Load(@"C:\test.xml"); 

foreach (var i in roots.Descendants("location")) 
{ 
    Console.WriteLine(i.Attribute("id").Value); 
} 

Mais je reçois seulement: IBM Microsoft

Merci!

+1

ce n'est pas XML valide. Il a deux éléments racine et certains nœuds "propriété" manquent la balise de fermeture. –

+0

Je sais, je viens de copier quelques lignes de tout ce document. – peroMajmun

Répondre

0

Voici la solution

var doc = XDocument.Load(yourXmlFilePath); 

var packages = doc.Descendants("package") 
       .Select(p => new 
       { 
        Name = p.Elements("property") 
          .SingleOrDefault(i => i.Attribute("name")?.Value == "cic.name") 
          ?.Attribute("value") 
          ?.Value, 
        Version = p.Elements("property") 
           .SingleOrDefault(i => i.Attribute("name")?.Value == "cic.version") 
           ?.Attribute("value") 
           ?.Value 
       }).ToList(); 

var result = names.Select(i => string.Format("{0} {1}", i.Name, i.Version)).ToList(); 

//result: "IBM Studio 13.4" 
//  "Windows XP 10.3.2" 
+0

Je reçois la référence d'objet non définie à l'instance d'une erreur d'objet. Qu'est-ce que je fais de mal? – peroMajmun

+0

Si vous publiez le fichier xml réel, nous pouvons être en mesure de vous aider. –

+0

voici mon fichier XML réel - https://pastebin.com/fq6QEHmF – peroMajmun

0

Votre code ne recherche que les attributs id sur location éléments.

Si vous voulez les valeurs cic.name et cic.version, vous devez les inclure dans votre requête.

var results = 
    from package in doc.Descendants("package") 
    select new 
    { 
     Name = (string) package.Elements("property") 
      .Where(x => (string) x.Attribute("name") == "cic.name") 
      .Attributes("value") 
      .Single(), 
     Version = (string) package.Elements("property") 
      .Where(x => (string) x.Attribute("name") == "cic.version") 
      .Attributes("value") 
      .Single(), 
    }; 

Voir this fiddle pour une démo.

0

Essayez quelque chose comme ça

foreach (var Locations in roots.Descendants("location")) 
{ 
    foreach (var item in Locations.Descendants("package")) 
    { 
     Console.WriteLine(item.Attribute("id").Value); 
    } 

}