2010-11-23 6 views
0

je le fichier XML suivant (il est en fait le dossier de VS2010)Extraction des attributs de XML à l'aide de LINQ

<?xml version="1.0" enconding="utf-8"?> 
<Project.....> 
<propertyGroup> 
.... 
</PropertyGroup> 
<ItemGroup> 
<Build Include = "Schema Objects\Schemas\dbo\Programmability\Stored Procedures\foo.sql> 
</Build> 
</ItemGroup> 
</Project> 

Je voudrais utiliser LINQ to XML pour extraire tous Construire des éléments qui sont des procédures stockées. Je le code suivant, qui ne semble pas fonctionner:

var doc = XDocument.Load(filePath); 
var elements = doc.Descendants("Build").Where(x => x.Attribute("Include").Value.Contains("Stored Procedure")).ToList(); 

Quelle est la bonne façon d'extraire les valeurs d'attributs?

Merci pour les réponses! Il s'est avéré qu'il y avait un espace de noms spécifié dans la balise Project que j'ai omis. C'est pourquoi je recevais 0 résultats de retour.

+2

Cela me semble correct. "Ne semble pas fonctionner" est assez vague - attention à décrire ce qui se passe réellement? Une chance c'est un problème d'espace de noms? –

Répondre

2
var doc = XElement.Parse(xml); 
// or 
var doc = XDocument.Load(path); 

var q = from e in doc.Descendants("Build") 
     from a in e.Attributes("Include") 
     where a.Value.Contains("Stored Procedure") 
     select e; 

var list = q.ToList(); 

P.S. cette approche ne nécessite pas de vérification de null toutes les variables, par exemple:

var q = from e in doc.Descendants("Build") 
     where e != null 
     from a in e.Attributes("Include") 
     where a != null && a.Value != null && a.Value.Contains("Stored Procedure") 
     select e; 
+0

@laconicdev: Heureux que ça a aidé! :) – abatishchev

0

Une fois que vous avez corrigé le code XML (il vous manque un guillemet fermant, et vous y avez des tags non appariés), cela fonctionne correctement. Testé dans LINQPad

string xml = 
    "<Project>"+ 
    "<PropertyGroup>" + 
    "</PropertyGroup>" + 
    "<ItemGroup>" + 
    "<Build Include = \"Schema Objects\\Schemas\\dbo\\Programmability\\Stored Procedures\\foo.sql\">"+ 
    "</Build>"+ 
    "</ItemGroup>"+ 
    "</Project>"; 

var doc = XDocument.Parse(xml); 
var elements = doc.Descendants("Build").Where (x => x.Attribute("Include").Value.Contains("Stored Procedure")).ToList(); 
elements.Dump(); 

Le résultat est:

<Build Include="Schema Objects\Schemas\dbo\Programmability\Stored Procedures\foo.sql"> </Build> 

Si vous essayez juste d'obtenir la valeur, essayez ceci:

var element2 = doc.Descendants("Build").Where (x => x.Attribute("Include").Value.Contains("Stored Procedure")).Select (x => x.Attribute("Include").Value); 
element2.Dump(); 

EDIT - Cela fonctionne aussi:

var element3 = doc.Descendants("Build").Select(x=>x.Attribute("Include")).Where(y=>y.Value.Contains("Stored Procedure")).FirstOrDefault().Value; 
Questions connexes