Извлечение атрибутов из XML с помощью LINQ - PullRequest
0 голосов
/ 23 ноября 2010

У меня есть следующий XML-файл (на самом деле это VS2010 dbproj-файл)

<?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 to XML для извлечения всех элементов сборки, которые являются хранимыми процедурами У меня есть следующий код, который, кажется, не работает:

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

Как правильно извлечь значения атрибута?

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

Ответы [ 2 ]

2 голосов
/ 23 ноября 2010
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. этот подход не требует проверки на ноль каждую переменную, например ::10000

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 голосов
/ 23 ноября 2010

Как только вы исправите 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();

РЕДАКТИРОВАТЬ - Это тоже работает:

var element3 = doc.Descendants("Build").Select(x=>x.Attribute("Include")).Where(y=>y.Value.Contains("Stored Procedure")).FirstOrDefault().Value;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...