在XML Document中找不到特定的XML元素

时间:2014-10-12 14:35:21

标签: c# html asp.net xml linq

我刚碰到一个头脑,我不太清楚为什么这不起作用。我想找到属性为“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元素中了?

任何帮助都会有很大的帮助!

2 个答案:

答案 0 :(得分:1)

使用Descendands代替ElementsElements只返回直接的孩子。

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”属性迭代元素。