我刚才在VB.Net中编写了一些代码,它们使用XElement,XDocument等来存储和操作HTML。一些HTML使用包含连字符/破折号( - )的属性名称。我遇到了使用LinqToXml按这些属性搜索XElements的问题。
当时我发现一篇文章(现在找不到)表明VB.net中的解决方案是使用这样的语法:
Dim rootElement as XElement = GetARootXElement()
Dim query = From p In rootElement.<div> Where p.@<data-qid> = 5 Select p
“魔术”语法是@&lt;&gt;它以某种方式将带连字符的属性名称转换为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将是stuff div,我想用attribuate data-qid = 5搜索内部div。
答案 0 :(得分:1)
使用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
答案 1 :(得分:1)
我可以使用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;
答案 2 :(得分:0)
不使用Sergey Berezovskiy提供的HtmlAgilityPack,使用XmlPath的Extensions类,包含使用LINQ to XML的扩展方法,可以更轻松地完成它:
Title: C\\+\\+