2012-06-08 80 views
0

我有一個xml文件,其中有兩個鏈接。我需要檢查,看看是否存在rel的鏈接,如果它獲得了它的href值。從URL鏈接獲取相對值鏈接

<a:link rel="prev" type="application/atom+xml" type="application/atom+xml" href="/v3.2/en-us/" /> 
<a:link rel="next" type="application/atom+xml" type="application/atom+xml" href="/v3.2/en-us/" /> 
+0

你能舉一個你到目前爲止的例子嗎? – Jake1164

+0

對不起,我得到的最多的是 string test = ReturnedAppsXml.Element(ns +「link」)。Attribute(rel).Value; 返回第一個鏈接的值。除循環以外,我可以使用正則表達式檢查,或者如果第二個鏈接存在,則使用下一個 – scripter78

+0

的rel值進行檢查。這不是有效的Xml,它帶有兩個類型屬性。 –

回答

2

如何將xml讀入XDocument並使用LINQ查找下一個元素。

XDocument x = XDocument.Parse("<xml><link rel=\"prev\" type=\"application/atom+xml\" href=\"/v3.2/en-us/\" /> <link rel=\"next\" type=\"application/atom+xml\" href=\"/v3.2/en-us/\" /></xml>"); 

XElement link = x.Descendants("link") 
       .FirstOrDefault(a => a.Attribute("rel").Value == "next"); 

String href = string.Empty; 
if(link != null) 
{ 
    href = link.Attribute("href").Value; 
} 
+0

爲了簡單起見,我刪除了命名空間,這裏是一個關於讀取xml命名空間的問題的鏈接,這些命名空間也可能派上用場。 http://stackoverflow.com/questions/8996300/search-xml-element-with-xml-namespace-prefix-c-sharp – Jake1164

+0

當'.FirstOrDefault'返回'.FirstOrDefault'的默認值時,這將失敗(拋出異常)如果找不到「rel」屬性的值,則返回「null」。 –

+0

正確,如果有任何項目丟失,它將引發異常。我會建議首先使用模式驗證xml。 – Jake1164

0

您可以使用this public xml library,然後用獲得的價值:

XElement root = XElement.Load(file); // or .Parse(string) 
string href = root.XGetElement<string>("//a:link[@rel={0}]/href", null, "next"); 
if(null != href) 
    ... link was found ... 

應該與a:link工作,但如果它不嘗試沒有a:。這將取決於名稱空間的聲明位置。如果它在根節點中應該沒問題。

XGetElement()基本上是XPathElement("//a:link[@rel={0}]").Get<string>("href", null)的組合。 Get()也是用於從節點獲取值的庫的一部分,首先檢查名稱的屬性,然後檢查子節點。