2010-11-23 7 views
0

У меня есть следующий файл XML (на самом деле это VS2010 dbproj файл)Извлечение атрибутов из XML с помощью 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> 

Я хотел бы использовать LINQ для XML, чтобы извлечь все сборки элементы, хранимые процедуры. У меня есть следующий код, который не похож на работу:

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

Что такое правильный способ извлечения значений атрибутов?

Спасибо за ответы! Оказалось, что в теге Project было указано пространство имен, которое я пропустил. Вот почему я получил 0 результатов.

+2

Это выглядит хорошо для меня. «Кажется, что не работает», довольно расплывчато - позаботьтесь о том, что на самом деле происходит? Есть ли вероятность проблемы с пространством имен? – 2010-11-23 14:04:31

ответ

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. этот подход не требует проверки на нуль каждой переменной, например:

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: Рад, что это помогло! :) – abatishchev 2010-11-23 19:15:06

0

Как только вы исправите XML (у вас отсутствует заключительная цитата, и у вас там есть непревзойденные теги), он отлично работает. Испытано в 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(); 

Результат:

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

Если вы просто пытаетесь получить значение, попробуйте следующее:

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

EDIT - Это тоже работает:

var element3 = doc.Descendants("Build").Select(x=>x.Attribute("Include")).Where(y=>y.Value.Contains("Stored Procedure")).FirstOrDefault().Value; 
Смежные вопросы