搜索属性名包含连字符/破折号的XElement
本文关键字:破折号 XElement 连字符 属性 包含 搜索 | 更新日期: 2023-09-27 18:19:02
我用VB写了一些代码。Net不久前正在使用XElement, XDocument等…来存储和操作HTML。有些HTML使用包含连字符/破折号(-)的属性名。我在使用LinqToXml按这些属性搜索xelement时遇到了问题。
当时我发现了一篇文章(现在找不到),指出VB.net中的解决方案是使用这样的语法:
Dim rootElement as XElement = GetARootXElement()
Dim query = From p In rootElement.<div> Where p.@<data-qid> = 5 Select p
"魔法"语法是@<>,它以某种方式将带连字符的属性名转换成Linq可以成功使用的格式。此代码在VB.Net中工作得很好。
问题是我们现在已经转换了所有的VB。Net代码转换为c#和转换实用程序阻塞了这种语法。我在VB中找不到任何关于这个"神奇"语法的东西。所以我希望有人能给我补充一些细节,特别是c#的等效是什么。谢谢。
下面是一个例子:
<div id='stuff'>
<div id='stuff2'>
<div id='stuff' data-qid=5>
<!-- more html -->
</div>
</div>
</div>
在上面的代码中,rootElement将是stuffdiv,我想用属性data-qid=5搜索内部div。
我可以在c#中编译以下内容-我认为它相当于最初的VB(注意最初的VB有Option Strict Off):
XElement rootElement = GetARootXElement();
var query = from p in rootElement.Elements("div")
where p.Attribute("data-qid").Value == 5.ToString()
select p;
下面是我的(修改后的)测试,它找到了带有'data-qid'属性的div:
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;
使用htmllagilitypack(可从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
应该具有等于'stuff'
的id。下面是获取data-qid
属性值的方法:
var qid = innerDiv.Attributes["data-qid"].Value; // 5
除了使用Sergey Berezovskiy提供的HtmlAgilityPack,还有一种更简单的方法可以不使用它,那就是使用XmlPath的Extensions类,其中包含与LINQ to XML一起工作的扩展方法:
using System.Xml.XPath;
var xml = XElement.Parse(html);
var innderDiv = xml.XPathSelectElement("//div[@id='stuff' and @data-qid=5]");