2012-07-27 72 views
0

我試圖讓從XML標籤叫sharecount內部文本得到內部文本,我需要通過normalized_url標籤,像這樣得到它:無法從FQL使用XPath C#

string ShareCount; 
    string Url = "'" + "http://www.example.com/Article.aspx?id=" + GuideID + "'"; 
    XmlNode Node; 
    try 
    { 
     //return Share count (using Xpath). 
     XmlDoc.SelectSingleNode("fql_query_response/link_stat[normalized_url=" + Url + "]/share_count"); 
     ShareCount = XmlDoc.InnerText; 
     int.TryParse(ShareCount, out Value); //Turn string to int. 
     return Value; 
    } 
    catch 
    { 
     return 0; 
    } 

和這是XML:

<fql_query_response xmlns="http://api.facebook.com/1.0/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" list="true"> 
<link_stat> 
<url>http://www.example.com/Article.aspx?id=1909</url> 
<normalized_url>http://www.example.com/Article.aspx?id=1909</normalized_url> 
<share_count>11</share_count> 
<like_count>3</like_count> 
<comment_count>0</comment_count> 
<total_count>14</total_count> 
<commentsbox_count>8</commentsbox_count> 
<comments_fbid>10150846665210566</comments_fbid> 
<click_count>0</click_count> 
</link_stat> 
</fql_query_response> 
<link_stat> 
<url>http://www.example.com/Article.aspx?id=1989</url> 
<normalized_url>http://www.example.com/Article.aspx?id=1989</normalized_url> 
<share_count>11</share_count> 
<like_count>3</like_count> 
<comment_count>0</comment_count> 
<total_count>14</total_count> 
<commentsbox_count>8</commentsbox_count> 
<comments_fbid>10150846665210566</comments_fbid> 
<click_count>0</click_count> 
</link_stat> 
</fql_query_response> 

的事情是我在返回值了:「www.example.com/Article.aspx?id=1132http://www.example.com/Article.aspx?id = 190900000101502138970422760「我做錯了什麼?謝謝!

+0

您使用的是.NET 3.5或更高版本。如果是這樣,請嘗試使用LINQ來查詢您的XML。這是一百萬倍更容易。 – 2012-07-27 16:22:34

回答

0

問題是,您正在選擇單個節點,但從根元素獲取內容。最重要的是,您有一個根名稱空間,因此需要使用NameSpaceManger進行搜索。試試這個示例:

 string GuideID = "1989"; 
     string Url = "'" + "http://www.example.com/Article.aspx?id=" + GuideID + "'"; 

     var XmlDoc = new XmlDocument(); 

     XmlDoc.Load(new FileStream("XMLFile1.xml",FileMode.Open,FileAccess.Read)); 
     var nsm = new XmlNamespaceManager(XmlDoc.NameTable); 
     nsm.AddNamespace("s", "http://api.facebook.com/1.0/"); 

     var node = XmlDoc.SelectSingleNode("s:fql_query_response/s:link_stat[s:normalized_url=" + Url + "]/s:share_count", nsm); 
     var ShareCount = node.InnerText;    

而這裏是LINQ方式與相同的命名空間管理器和XPathSelector。

XDocument xdoc = XDocument.Load(new FileStream("XMLFile1.xml", FileMode.Open, FileAccess.Read)); 
     var lnode = xdoc.XPathSelectElements("s:fql_query_response/s:link_stat[s:normalized_url=" + Url + "]/s:share_count",nsm).First(); 
     var ret = lnode.Value; 
+0

謝謝,我將Xpath解決方案與命名空間一起使用,它的工作非常完美! – Yuval 2012-07-27 20:38:22

+0

我忘了提及,您發佈的示例XML無效(在文檔中間有一個額外的關閉fql_query_response)。很高興解決方案工作。 – Darek 2012-07-27 20:54:48