我刚碰到一个头脑,我不太清楚为什么这不起作用。我想找到属性为“video”的所有元素。
我的XML文档如下所示:
<MainMenu>
<div id="BroughtInMenu">
<div class="menuItem0">
Menu Item
<div class="subMenu0">
<div class="menuItem1">
Dictation
<div class="subMenu1">
<div class="menuItem2" video="1">Fee Earner</div>
<div class="menuItem2" video="1">Secretary</div>
<div class="menuItem2" video="1">View File History</div>
</div>
</div>
<div class="menuItem1">
PM Advanced Agenda
<div class="subMenu1">
<div class="menuItem2">
Help
<div class="subMenu2">
<div class="menuItem3" video="1">Release Notes</div>
</div>
</div>
<div class="menuItem2">
System Maintenance
<div class="subMenu2">
<div class="menuItem3" video="1">Additional Field Setup</div>
<div class="menuItem3" video="1">Role Permission Maintenance</div>
<div class="menuItem3" video="1">Shared Diary Permissions</div>
</div>
</div>
<div class="menuItem2">
Utilities
<div class="subMenu2">
<div class="menuItem3" video="1">Change Entity Subtype</div>
<div class="menuItem3" video="1">Field Maintenance</div>
<div class="menuItem3" video="1">Move Client and Files to Fee Earner</div>
<div class="menuItem3" video="1">Reallocate Files</div>
</div>
</div>
</div>
</div> . . . . . . . . . . . . . . . . ..
这与HTML非常相似。这是一个网站,所以最后我想获得所有具有“视频”属性的元素。
如果我能做到这一点,那么我只会使用属性“video”抓取div元素,然后我就可以将其用于其他内容,比如在搜索中,我实际搜索xml文档和返回div等等...希望你能看到我在这里的漂移...
由于视频属性将指向某个位置,因此在单击div时只需跳转到视频就会非常有用。
到目前为止,我已尝试过这个,但我根本没有得到这些元素:
XElement xDoc = XElement.Load(Server.MapPath("automation/xml/mainMenu.xml"));
IEnumerable<XElement> list = from el in xDoc.Elements("div") where el.Attribute("video") != null select el;
foreach (XElement element in list)
{
//Nothing found?
}
我也考虑过REGEX ......也许正则表达式能够拉出我想要的div,已经是文本格式,这样我就可以把它推到网站的html元素中了?
任何帮助都会有很大的帮助!
答案 0 :(得分:1)
使用Descendands
代替Elements
。 Elements
只返回直接的孩子。
var xDoc = XElement.Load(Server.MapPath("automation/xml/mainMenu.xml"));
var list = from el in xDoc.Descendants("div")
where el.Attribute("video") != null
select el;
foreach (XElement element in list)
{
//Nothing found?
}
答案 1 :(得分:0)
您可以选择XPath中存在特定属性的元素。要使用XPath扩展方法,您需要包含命名空间。
using System.Xml.XPath;
XPath,例如“// div [@video]”将包含任何级别的所有“div”标记,但会将所选元素过滤为仅具有“video”属性的标记,因此你没有通过大量元素检查是否存在属性而不必要地循环。
var xDoc = XElement.Load(Server.MapPath("automation/xml/mainMenu.xml"));
foreach (var divWithVideo in xDoc.XPathSelectElements ("//div[@video]")) {
Console.WriteLine (divWithVideo);
}
在这里,您只是使用“video”属性迭代元素。