2016-04-12 41 views
2

Aşağıdaki XPath sorgularını LINQ'a çevirirken sorun yaşıyorum. LINQ eşdeğerini bulamadığım için position() yöntemiyle ne yapacağımı bilmiyorum.XPath - LINQ için çeviri

(//table[@border='1'])[1]//tr[position() > 1 and position() < last()] 

Ayrıca, sorguda .// bir LINQ sürümünü bulamıyor:

.//div[span/@title='Event group'] 

biri bana bu tercüme yardımcı olabilir mi? ,

doc.Descendants("table") 
    .Where(o => (string)o.Attribute("border") == "1") 
    .FirstOrDefault()? 

Ve bu ifade //tr[position() > 1 and position() < last()] kabaca çevirir:

+1

Eğer LINQ ile XPath kullanamaz mıyız? https://msdn.microsoft.com/en-us/library/bb342176(v=vs.110).aspx – MarcinJuraszek

+0

@MarcinJuraszek XML'yi değil, HTML'yi ayrıştıyorum (bu soruyu sormamın nedeni, HtmlAgilityParser'ın neden olmadığının nedeni Ben geliştirmek için geliştirdiğim Android uygulamaları, XPath destek, bu yüzden LINQ içine tüm XPath çevirmek için çalışıyorum) – arestifo

+0

HtmlAgilityPack LINQ yerleşik için destek olmalıdır ... – code4life

cevap

0

sizin XPath (//table[@border='1'])[1] bu bölümü, aşağıdaki LINQ kabaca tercüme edilebilir (doc varsayalım bir XDocument örneği olan)

.Descendants("tr").Where(o => { 
    var trs = o.Parent.Elements("tr").ToList(); 
    var position = trs.IndexOf(o)+1; //since XPath position index starts from 1 
    return position > 1 && position < trs.Count; 
}) 

Yukarıdaki iki örnekte, LINQ'da //, position() ve @attribute'un nasıl ifade edileceğini görebilmeniz gerekir. 2. XPath'ınızı tercüme etmek bir egzersiz olarak kalıyor :)

+0

Çok teşekkürler! Bu tam ihtiyacım olan şey. – arestifo

+0

@ user2396873: HTML Çeviklik Paketi kullanıyor musunuz? XML'in sahip olduğu LINQ ile aynı API'lara sahip değildir. –

0

Literal bir çeviri yapmaya çalışmak yerine, aslında eşdeğer bir sorgu yapmanız gerekir.

Sorgu, birinci ve son satırı atlayan satırları seçiyor. Bunu elde etmenin çok daha verimli yolları var.

Sorgunun ilk kısmı, kenarlığı olan ilk tabloyu seçmektir. Sonra ilkleri atlayıp sonra sonuncuyu alarak satırları alın. Sonun, hepsini almadan ve saymadan ne olduğunu bulmanın bir yolu yok.

var table = doc.DocumentNode.Descendants("table") 
    .Where(e => e.Attributes["border"] == "1") 
    .First(); 
var rows = table.Descendants("tr") 
    .Skip(1) // skip the first row 
    .ToList(); 
var result = rows.Take(rows.Count - 1); // take all up to the last 
diğer kısmı için

(//table[@border='1'])[1]//tr[position() > 1 and position() < last()] 
, // eşdeğer Descendants() çağırmaktadır.

.//div[span/@title='Event group'] 
var query = 
    from d in e.Descendants("div") 
    where d.Elements("span").Any(s => s.Attribute["title"] == "Event group") 
    select d;