2015-03-16 2 views
0

Вот XML (я накопил HTML-страницы в виде XML, чтобы разобрать его обобщенно:Как проверить, содержит ли атрибут XML строку?

<td width="76" class="DataB">2.276</td> 
<td width="76" class="DataB">2.289</td> 
<td width="76" class="DataB">2.091</td> 
<td width="76" class="DataB">1.952</td> 
<td width="76" class="DataB">1.936</td> 
<td width="76" class="Current2">1.899</td> 

Сейчас я пытаюсь найти все элементы, которые содержат строку текущего, так как веб-страницы изменяет число на спине:

var xElements = xml.Descendants("td").Where(element => ((string) element.Attribute("class")).Contains("Current")); 

Это возвращает ошибку object does not exist здесь:

((string) element.Attribute("class")) 

Как я могу проверить, если атрибут он содержит что-то?

+1

Вы уверены, что XML не объявляет пространство имен по умолчанию? – MarcinJuraszek

+0

Вы должны взглянуть на [Htmlagilitypack] (http://htmlagilitypack.codeplex.com/). Это хорошая библиотека для анализа содержимого Html (и она позволяет конвертировать и обеспечивать хороший формат Xhtml). –

+0

@SteveB Фактически, откуда берутся данные. Я создал службу очистки экрана, которая сбрасывает страницу, затем преобразует ее в XDocument. – Robert

ответ

4

Если вы спросили меня, было бы проще написать в качестве запроса xpath. Таким образом, вам не нужно иметь дело с случаями, когда элементы не содержат атрибутов класса и других подобных случаев.

var query = xml.XPathSelectElements("//td[contains(@class,'Current')]"); 

В противном случае вам нужно будет проверить наличие атрибута, прежде чем пытаться его прочитать.

// query syntax makes this a little nicer 
var query = 
    from td in xml.Descendants("td") 
    let classStr = (string)td.Attribute("class") 
    where classStr != null && classStr.Contains("Current") 
    select td; 
// or alternatively, provide a default value 
var query = 
    from td in xml.Descendants("td") 
    where ((string)td.Attribute("class") ?? "").Contains("Current") 
    select td; 
0

Там, наверное, что-то не так с входом XML, который вы используете, - пытается этот код работает для меня в LINQPad:

XDocument xml = XDocument.Parse(@"<tr><td width=""76"" class=""DataB"">2.276</td> 
<td width=""76"" class=""DataB"">2.289</td> 
<td width=""76"" class=""DataB"">2.091</td> 
<td width=""76"" class=""DataB"">1.952</td> 
<td width=""76"" class=""DataB"">1.936</td> 
<td width=""76"" class=""Current2"">1.899</td></tr>"); 

var xElements = xml.Descendants("td").Where(element => ((string) element.Attribute("class")).Contains("Current")); 

xElements.Dump(); 

Вы уверены, что ваш XML является действительным?

+0

если я говорю (строка) element.Attribute ("class") == "Current" отлично работает – Robert

+0

Можете ли вы разместить больше XML и где вы действительно выполняете запрос? –

+0

Обе эти вещи опубликованы. XML, который вы видите, - это соответствующие данные, и запрос, который я пытаюсь сделать, - это тот, который содержится в коде. Я не уверен, что еще могу опубликовать? – Robert