搜索属性名称包含连字符/破折号的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的内格。
我可以得到下面的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;
它确实有Option Strict Off,我忽略了它,因为我认为它并不重要。我也可以得到这个编译,但它似乎没有找到具有data-qid属性的div。 linq查询在VB.net和C#中都不会返回任何内容,除非您使用酷的Html文字。 –
看到我的'全面测试' - 我不得不在'xml'变量的初始化中使用'5'而不是5。 –
我把这段代码放到一个控制台应用程序中并让它输出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
HtmlAgilityPack让我解析不是来自文件的Html吗?我可以简单地从一个字符串或类似的东西加载它吗? –
这个问题的答案是肯定的:doc.LoadHtml(string)。那个xpath查询(是那个xpath?)没有返回任何东西;但是,这确实:doc.DocumentNode.SelectSingleNode(“// div [@ data-qid ='5']”);所以我相信这会解决我的问题。我在测试应用程序中工作,让我们看看它在真实应用程序中的工作原理。 –
@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]");
你可以提供你正试图解析的示例xml吗? –
我在原帖中添加了一个示例。 –
data-qid属性值没有引号吗?你试图分析什么价值? –