3

不久前,我在 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

“神奇”语法是 @<>,它以某种方式将连字符的属性名称转换为 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 内容,我想使用属性 data-qid=5 搜索内部 div。

4

3 回答 3

2

我可以在 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;
于 2013-06-20T00:52:11.703 回答
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
于 2013-06-19T22:45:36.477 回答
0

除了使用 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]");
于 2016-01-23T12:23:29.040 回答