C# 如何检查XML属性是否包含字符串?
以下是XML(我以XML格式保存了一个html页面,以便对其进行一般性解析:C# 如何检查XML属性是否包含字符串?,c#,xml,linq,C#,Xml,Linq,以下是XML(我以XML格式保存了一个html页面,以便对其进行一般性解析: <td width="76" class="DataB">2.276</td> <td width="76" class="DataB">2.289</td> <td width="76" class="DataB">2.091</td> <td width="76" class="DataB">1.952</td> <
<td width="76" class="DataB">2.276</td>
<td width="76" class="DataB">2.289</td>
<td width="76" class="DataB">2.091</td>
<td width="76" class="DataB">1.952</td>
<td width="76" class="DataB">1.936</td>
<td width="76" class="Current2">1.899</td>
这将返回对象不存在的错误:
((string) element.Attribute("class"))
如何检查属性是否包含某些内容?您使用的XML输入可能有问题-在LINQPad中尝试以下代码对我很有用:
XDocument xml = XDocument.Parse(@"<tr><td width=""76"" class=""DataB"">2.276</td>
<td width=""76"" class=""DataB"">2.289</td>
<td width=""76"" class=""DataB"">2.091</td>
<td width=""76"" class=""DataB"">1.952</td>
<td width=""76"" class=""DataB"">1.936</td>
<td width=""76"" class=""Current2"">1.899</td></tr>");
var xElements = xml.Descendants("td").Where(element => ((string) element.Attribute("class")).Contains("Current"));
xElements.Dump();
xdocumentxml=XDocument.Parse(@“2.276
2.289
2.091
1.952
1.936
1.899");
var-xElements=xml.substands(“td”)。其中(element=>((string)element.Attribute(“class”)。包含(“Current”);
xElements.Dump();
您确定您的XML是有效的吗?您使用的XML输入可能有问题-在LINQPad中尝试此代码对我很有用:
XDocument xml = XDocument.Parse(@"<tr><td width=""76"" class=""DataB"">2.276</td>
<td width=""76"" class=""DataB"">2.289</td>
<td width=""76"" class=""DataB"">2.091</td>
<td width=""76"" class=""DataB"">1.952</td>
<td width=""76"" class=""DataB"">1.936</td>
<td width=""76"" class=""Current2"">1.899</td></tr>");
var xElements = xml.Descendants("td").Where(element => ((string) element.Attribute("class")).Contains("Current"));
xElements.Dump();
xdocumentxml=XDocument.Parse(@“2.276
2.289
2.091
1.952
1.936
1.899");
var-xElements=xml.substands(“td”)。其中(element=>((string)element.Attribute(“class”)。包含(“Current”);
xElements.Dump();
你确定你的XML是有效的吗?如果你问我,作为xpath查询编写会更容易。这样你就不必处理元素不包含类属性的情况和其他类似情况
var query = xml.XPathSelectElements("//td[contains(@class,'Current')]");
否则,您必须在尝试读取属性之前检查属性是否存在
// query syntax makes this a little nicer
var query =
from td in xml.Descendants("td")
let classStr = (string)td.Attribute("class")
where classStr != null && classStr.Contains("Current")
select td;
// or alternatively, provide a default value
var query =
from td in xml.Descendants("td")
where ((string)td.Attribute("class") ?? "").Contains("Current")
select td;
如果你问我,写xpath查询会更容易,这样你就不必处理元素不包含类属性的情况和其他类似情况
var query = xml.XPathSelectElements("//td[contains(@class,'Current')]");
否则,您必须在尝试读取属性之前检查属性是否存在
// query syntax makes this a little nicer
var query =
from td in xml.Descendants("td")
let classStr = (string)td.Attribute("class")
where classStr != null && classStr.Contains("Current")
select td;
// or alternatively, provide a default value
var query =
from td in xml.Descendants("td")
where ((string)td.Attribute("class") ?? "").Contains("Current")
select td;
你确定XML没有声明默认名称空间吗?你应该看一下。这是解析Html内容的好库(它避免了转换并确保了良好的Xhtml格式)@SteveB实际上这就是数据的来源。我创建了一个屏幕抓取服务,它抓取一个页面,然后将其转换为XDocument。你确定XML没有声明默认名称空间吗?你应该看一下。这是解析Html内容的好库(它避免了转换并确保了良好的Xhtml格式)@SteveB事实上,这就是数据的来源。我创建了一个屏幕抓取服务,可以抓取一个页面,然后将其转换为XDocument。如果我说(string)element.Attribute(“class”)=“Current”它工作得很好。你可以发布更多的XML以及你实际执行查询的位置吗?这两个东西都被发布了。你看到的XML是相关数据,而我尝试进行的查询是代码中的一个。我不确定我还能发布什么?XML不完整。你不能按原样加载到XDocument中,它没有pro每个根节点。查询是编写的,但没有在提供的代码中执行(例如LINQPad中的xElements.Dump()或对xElement集合进行迭代)明白了吗?我实际上只是从列表中获取值,并将数据添加到数据库中,所以这部分可能没有帮助。但是如果我说(字符串)的话,只需要一秒钟的时间元素属性(“类”)=“当前”它工作得很好。你可以发布更多的XML以及你实际执行查询的位置吗?这两个东西都被发布了。你看到的XML是相关数据,而我尝试进行的查询是代码中的一个。我不确定我还能发布什么?XML不完整。你不能按原样加载到XDocument中,它没有pro每个根节点。查询是编写的,但没有在提供的代码中执行(例如LINQPad中的xElements.Dump()或对xElement集合进行迭代)明白了吗?我实际上只是从列表中获取值并将数据添加到数据库中,所以这部分可能没有帮助。但数据只需要一秒钟