搜索具有包含连字符/短划线的属性名称的XElement

时间:2013-06-19 22:14:21

标签: c# html vb.net linq linq-to-xml

我刚才在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。

3 个答案:

答案 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\\+\\+