搜索属性名包含连字符/破折号的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。

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

我可以在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]");