2010-11-23 10 views
0

Ich habe die folgende XML-Datei (es ist eigentlich VS2010 dbproj Datei)Extrahieren von Attributen von XML mithilfe von 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> 

Ich möchte LINQ to XML verwenden, um alle Elemente beim Aufbau zu extrahieren, die Prozeduren gespeichert sind. Ich habe den folgenden Code, der nicht zu funktionieren scheint:

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

Was ist der richtige Weg, um die Attributwerte zu extrahieren?

Danke für die Antworten! Es stellte sich heraus, dass im Project-Tag ein Namespace angegeben war, den ich weggelassen habe. Deshalb bekam ich 0 Ergebnisse zurück.

+2

Das sieht in Ordnung für mich. "Scheint nicht zu funktionieren" ist ziemlich vage - vorsichtig zu beschreiben, was tatsächlich passiert? Gibt es eine Chance, dass es ein Namespace-Problem ist? –

Antwort

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. Dieser Ansatz erfordert keine Prüfung gegen Null für jede Variable, z. B .:

+0

@laconicdev: Schön, dass es geholfen hat! :) – abatishchev

0

Sobald Sie das XML reparieren (Sie verpassen ein schließendes Zitat, und Sie haben dort nicht übereinstimmende Tags), funktioniert es gut. Getestet in 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(); 

Ergebnis ist:

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

Wenn Sie nur versuchen, den Wert zu erhalten, versuchen Sie dies:

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

EDIT - Das funktioniert auch:

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