C# 搜索具有包含连字符/破折号的属性名称的XElement

C# 搜索具有包含连字符/破折号的属性名称的XElement,c#,html,vb.net,linq,linq-to-xml,C#,Html,Vb.net,Linq,Linq To Xml,不久前,我在VB.Net中编写了一些代码,使用XElement、XDocument等。。。存储和操作HTML。一些HTML使用包含连字符/破折号的属性名。我在使用LinqToXml通过这些属性搜索元素时遇到了问题 当时我发现一篇文章“现在找不到”,指出VB.net中的解决方案是使用如下语法: Dim rootElement as XElement = GetARootXElement() Dim query = From p In rootElement.<div> Where p.

不久前,我在VB.Net中编写了一些代码,使用XElement、XDocument等。。。存储和操作HTML。一些HTML使用包含连字符/破折号的属性名。我在使用LinqToXml通过这些属性搜索元素时遇到了问题

当时我发现一篇文章“现在找不到”,指出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>
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
var innerDiv = 
    doc.DocumentNode.SelectSingleNode("//div[@id='stuff']/*/div[@data-qid=5]");
在我上面的代码中,rootElement将是stuff div,我希望用attribute数据qid=5搜索内部div。

使用NuGet提供的解析HTML。以下是一个例子:

<div id='stuff'>
    <div id='stuff2'>
        <div id='stuff' data-qid=5>
            <!-- more html -->
        </div>
    </div>
</div>
HtmlDocument doc = new HtmlDocument();
doc.Load("index.html");
var innerDiv = 
    doc.DocumentNode.SelectSingleNode("//div[@id='stuff']/*/div[@data-qid=5]");
此XPath查询获取数据qid等于5的内部div标记。另外,外部div的id应该等于'stuff'。以下是获取数据qid属性值的方法:

var qid = innerDiv.Attributes["data-qid"].Value; // 5

我可以用C语言编译以下内容-我认为这相当于原始VB注意,原始VB有选项Strict Off:

XElement rootElement = GetARootXElement();
var query = from p in rootElement.Elements("div")
            where p.Attribute("data-qid").Value == 5.ToString()
            select p;
下面是我修改过的测试,它查找具有“dataqid”属性的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;

与Sergey Berezovskiy提供的HtmlAgilityPack不同,没有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]");

你能提供你试图解析的xml样本吗?我在原始文章中添加了一个例子。数据qid属性值周围没有引号?您试图解析的值是什么?这种神奇的语法看起来像VB.NET中的XML文本。我认为C语言中没有等价物。感谢您对XML文本的解释。我不知道。另外,我把HTML示例搞砸了,最内层div中的内容应该是stuff3。HtmlAgilityPack是否允许我解析不是来自文件的HTML?我可以简单地从字符串或类似的东西加载它吗?这个问题的答案是肯定的:doc.LoadHtmlstring。那个xpath查询就是那个xpath吗?没有归还任何东西;但是,确实是这样的:doc.DocumentNode.SelectSingleNode//div[@data qid='5'];所以我相信这会解决我的问题。我让它在一个测试应用程序中工作,让我们看看它在真实应用程序中是如何工作的。@DovanRogars抱歉,当时处于脱机状态。是的,您正在使用正确的方法加载xml字符串。我的xpath查询对您的示例数据有效,即使没有数据qid attributeIt的引号,它也有选项Strict Off,我忽略了它,因为我认为这无关紧要。我也能够编译它,但是它似乎找不到带有dataqid属性的div。linq查询在VB.net和C中都不会返回任何内容,除非您使用很酷的Html文本。请参阅我的“完整测试”-在初始化“xml”变量时,我必须使用“5”而不是“5”。我将该代码放入控制台应用程序,并让它输出查询。计数为0。问题似乎出在linq查询中,但是我找不到它。请看我修改过的测试-它现在的计数为1。