搜索属性名称包含连字符/破折号的XElement

问题描述:

我前段时间在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属性值没有引号吗?你试图分析什么价值? –

我可以得到下面的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. –

使用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属性 –

而不是使用谢尔盖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]");