2013-06-19 81 views
2

我前段時間在VB.Net中編寫了一些代碼,使用XElement,XDocument等來存儲和操作HTML。某些HTML使用包含連字符/短劃線( - )的屬性名稱。我遇到了使用LinqToXml通過這些屬性搜索XElements的問題。搜索屬性名稱包含連字符/破折號的XElement

那時候我發現了一篇文章(現在不能找到它)是表示在VB.net的解決方案是使用的語法如下:

Dim rootElement as XElement = GetARootXElement() 
Dim query = From p In rootElement.<div> Where [email protected]<data-qid> = 5 Select p 

「神奇」的語法是@ <>它以某種方式將連字符的屬性名稱轉換成可以被Linq成功使用的格式。這段代碼在VB.Net中很好用。

問題是,我們現在已經將所有VB.Net代碼轉換爲C#,並且轉換實用程序在此語法上被阻塞。在VB.Net中我找不到任何關於這個「魔術」語法的東西,所以我希望有人能夠填寫我的細節,特別是C#的等價物。謝謝。

下面是一個例子:

<div id='stuff'> 
    <div id='stuff2'> 
     <div id='stuff' data-qid=5> 
      <!-- more html --> 
     </div> 
    </div> 
</div> 

在我的代碼的rootElement的上面將是東西的div和我會希望搜索與attribuate數據QID = 5的內格。

+0

你可以提供你正試圖解析的示例xml嗎? –

+0

我在原帖中添加了一個示例。 –

+0

data-qid屬性值沒有引號嗎?你試圖分析什麼價值? –

回答

1

我可以得到下面的C#編譯 - 我認爲這是相當於原來的VB(請注意,原VB有選項嚴格關):

XElement rootElement = GetARootXElement(); 
var query = from p in rootElement.Elements("div") 
      where p.Attribute("data-qid").Value == 5.ToString() 
      select p; 

這是我(修訂)測試,發現在div與「數據QID」屬性:

var xml = System.Xml.Linq.XElement.Parse("<div id='stuff'><div id='stuff2'><div id='stuff3' data-qid='5'><!-- more html --></div></div></div>"); 
var rootElement = xml.Element("div"); 
var query = from p in rootElement.Elements("div") 
    where p.Attribute("data-qid").Value == 5.ToString() 
    select p; 
+0

它確實有Option Strict Off,我忽略了它,因爲我認爲它並不重要。我也可以得到這個編譯,但它似乎沒有找到具有data-qid屬性的div。 linq查詢在VB.net和C#中都不會返回任何內容,除非您使用酷的Html文字。 –

+0

看到我的'全面測試' - 我不得不在'xml'變量的初始化中使用'5'而不是5。 –

+0

我把這段代碼放到一個控制檯應用程序中並讓它輸出query.Count(),它的值爲0. –

1

使用HtmlAgilityPack(可從NuGet獲得)解析HTML。下面是一個例子:

HtmlDocument doc = new HtmlDocument(); 
doc.Load("index.html"); 
var innerDiv = 
    doc.DocumentNode.SelectSingleNode("//div[@id='stuff']/*/div[@data-qid=5]"); 

此XPath查詢獲取內div標籤具有data-qid等於5。外div應該有ID等於'stuff'。這裏是讓data-qid屬性值的方式:

var qid = innerDiv.Attributes["data-qid"].Value; // 5 
+0

HtmlAgilityPack讓我解析不是來自文件的Html嗎?我可以簡單地從一個字符串或類似的東西加載它嗎? –

+1

這個問題的答案是肯定的:doc.LoadHtml(string)。那個xpath查詢(是那個xpath?)沒有返回任何東西;但是,這確實:doc.DocumentNode.SelectSingleNode(「// div [@ data-qid ='5']」);所以我相信這會解決我的問題。我在測試應用程序中工作,讓我們看看它在真實應用程序中的工作原理。 –

+0

@DovanRogars抱歉,當前離線。是的,您正在使用加載xml字符串的正確方法。我的xpath查詢處理你的樣本數據,即使沒有引用data-qid屬性 –

0

而不是使用謝爾蓋Berezovskiy提供HtmlAgilityPack的,還有更簡單通過使用XmlPath的擴展類,包含擴展方法來與LINQ to XML一起工作的方式來做到這一點:

using System.Xml.XPath; 
var xml = XElement.Parse(html); 
var innderDiv = xml.XPathSelectElement("//div[@id='stuff' and @data-qid=5]"); 
相關問題