2012-06-08 45 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()也是用于从节点获取值的库的一部分,首先检查名称的属性,然后检查子节点。