【问题标题】:Find url name in XML document在 XML 文档中查找 url 名称
【发布时间】:2013-03-28 22:53:22
【问题描述】:

我需要在 XML 文档中搜索我网站的特定 url 名称。

这样当用户浏览我的网站时,他们所在的任何页面都会决定侧边菜单的外观。到目前为止,这是我的代码:

var urlName = Path.GetFileNameWithoutExtension(Request.Url.AbsolutePath);

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load(Server.MapPath("~/App_Data/menu.xml"));
xmlDocument.SelectNodes("//*[contains(text(), 'urlName')]");

一旦找到,我希望结果返回该网站节点和父节点。

<menu type="personal">
  <L1 shortName="Something here" id="/personal/something-here.aspx" url="../personal/something-here.aspx" regions="123">
    <L2 shortName="anything here" id="/personal/anything-here.aspx" url="../personal/anything-here.aspx" regions="123">
      <L3 shortName="everything here" id="/personal/everything-here.aspx" url="../personal/everything-here.aspx" regions="123"/>
    </L2>
    <L2 shortName="something" id="/personal/something.aspx" url="../personal/something.aspx" regions="123">
      <L3 shortName="anything" id="/personal/anything.aspx" url="../personal/anything.aspx" regions="123" />
      <L3 shortName="everything" id="/personal/everything.aspx" url="../personal/everything.aspx" regions="123" />
    </L2>
  </L1>
</menu>

【问题讨论】:

  • 你能添加一个文件“menu.xml”的sn-p以便我们看到它的结构吗?
  • 您是否要查找shortNames?你想在哪个级别找到它,L1L2L3 还是三个?
  • 不,不是短名称,我得到文件名,它可以搜索 id 或 url。

标签: c# html xml


【解决方案1】:

我会使用 Linq。这将检索父项的元素名称。

    var urlName = Path.GetFileNameWithoutExtension(Request.Url.AbsolutePath);

    XDocument xDocument = XDocument.Load(Server.MapPath("~/App_Data/menu.xml"));
    var url = (from p in doc.Descendants().Elements()
               where p.Attribute("url").Value == urlName 
               select p.Parent.Name.LocalName).FirstOrDefault();

您可能需要使用where p.Attribute("id").Value == urlName 而不是 url,但您可以解决这个问题!

如果要整个元素,改成select p.Parent).FirstOrDefault();

【讨论】:

  • 我最初想使用类似的东西但是它没有返回任何东西。当我调试时,我得到“枚举没有结果”有什么想法吗?
  • 是的。一旦有人访问该页面,就会触发一个 jquery 函数并相应地编辑侧边菜单。
  • 例如,如果他们转到关于汽车的页面“cars.aspx”,则菜单中的汽车项目会突出显示。然后,如果他们转到有关联系人“contact-us.aspx”的页面,则突出显示联系我们。我只需要找到一种方法来搜索 xml 文件中的相应站点。一旦我有了,那么 jquery 部分应该是容易(希望如此)。
  • 只是它的节点位置和/或父节点,例如 L3 将对应 L2。很抱歉让这件事变得困难。我不太擅长解释事情。
  • @Chris,更新了我的答案,看看是否有帮助。如果从 FirstOrDefault() 更改为 First,您是否希望总能得到答案。我必须指出,您可以在这里轻松使用真实数据,并得到其他人更快的响应!
【解决方案2】:

感谢所有提供帮助的人,但是我找到了另一种完美的方法。再次感谢。

        XmlDocument xmlDocument = new XmlDocument();

        xmlDocument.Load(Server.MapPath("~/App_Data/menu.xml"));

        XmlNodeList levelOneElements = xmlDocument.SelectNodes("root/menu[contains(@type,'" + Title.Text.ToLower() +  "')]/L1");

        for (int i = 0; i < levelOneElements.Count; i++)
        {
            XmlNode levelOne = levelOneElements.Item(i);
            if (levelOne.OuterXml.Contains(_menu))
            {
                _index = i;
                break;
            }
        }

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 2012-03-04
    • 2010-10-05
    • 2011-02-27
    • 2020-04-14
    • 2023-03-21
    • 2021-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多