2009-05-12 6 views
0

XML文書から順序付けられていないリストを作成する再利用可能なメソッドがあります。どのノードに配置されているかを調べるために、クエリーストリングを使用してXML文書のURLと照合します。子ノードが選択されている場合、親ノードにCSSクラスを追加します。

子ノードに配置されている場合、親ノードに 'current'クラスを追加する必要があります。

 
    MenuItem 1 
    MenuItem 2 [class current] 
     MenuItem 3 [class current] (selected node) 
    MenuItem 4 

私のXML文書は、このようなものです::

<MenuItem Name="MenuItem 1" Url="MenuItem1.aspx"/> 
<MenuItem Name="MenuItem 2" Url="MenuItem2.aspx"> 
    <MenuItem Name="MenuItem 3" Url="MenuItem3.aspx" /> 
</MenuItem> 
<MenuItem Name="MenuItem4" Url="MenuItem4.asp" /> 

そして、私の現在のコードは次のようになります。だから私は、機能のいくつかの種類が必要

foreach (XmlNode item in menuitems) 
{ 
    if (HttpContext.Current.Request.Url.AbsolutePath.ToLower() == item.Attributes["Url"].Value.ToLower()) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, "current"); 
    } 
    writer.RenderBeginTag(HtmlTextWriterTag.Li); 
    // And so on... 
} 

このよう

このノードを見つけてそのノードにクラスを配置します。

さらに詳しいコードや情報などが必要な場合は、ぜひご記入ください。 :-)

ありがとうございました!

答えて

0

お返事ありがとうございます。しかし、私は自分自身の問題を解決しました。あなたたちはあなたの努力のためにアップボトムを手に入れます。ここで

が私の解決策だった:

System.Collections.Hashtable ht = new System.Collections.Hashtable(); 
ht.Add("Url", HttpContext.Current.Request.Url.AbsolutePath.ToLower()); 

XmlNode currentpage = Core.FindChildNode(item, "MenuItem", ht); 

if (HttpContext.Current.Request.RawUrl.ToLower() == item.Attributes["Url"].Value.ToLower() || currentpage != null) 
{ 
    writer.AddAttribute(HtmlTextWriterAttribute.Class, "current"); 
} 

これは私のFindChildNode方法

public static XmlNode FindChildNode(XmlNode parent, string name, System.Collections.Hashtable keyvaluecollection) 
    { 
     if (parent.NodeType != XmlNodeType.Element) return null; 
     XmlElement el = (XmlElement)parent; 

     XmlNodeList nodes = el.GetElementsByTagName(name); 
     foreach (XmlNode node in nodes) 
     { 
      if (node.NodeType == XmlNodeType.Element) 
      { 
       bool found = false; 
       foreach (string key in keyvaluecollection.Keys) 
       { 
        if (node.Attributes[key] != null && node.Attributes[key].Value == (string)keyvaluecollection[key]) 
        { 
         found = true; 
        } 
        else 
        { 
         found = false; 
         break; 
        } 
       } 
       if (found) return node; 
      } 
     } 
     return null; 
    } 

が魅力のように動作しているようです! :-)

1

これは特にエレガントな解決策ではありませんが、私は問題を正しく理解すれば、あなたは子ノードが選択されているかどうかを確認する方法作成することができます。

private static bool IsChildSelected(XmlNode item) 
{ 
    foreach(XmlNode child in item.ChildNodes) 
    { 
     if(HttpContext.Current.Request.Url.AbsolutePath.ToLower() == child.Attributes["Url"].Value.ToLower()) 
     { 
      return true; 
     } 
    } 
    return false; 
} 

を、あなたはを反復処理として、それをチェックしますノード:

foreach(XmlNode item in menuitems) 
{ 
    if(HttpContext.Current.Request.Url.AbsolutePath.ToLower() == item.Attributes["Url"].Value.ToLower() 
     || IsChildSelected(item)) 
    { 
     writer.AddAttribute(HtmlTextWriterAttribute.Class, "current"); 
    } 
    writer.RenderBeginTag(HtmlTextWriterTag.Li); 
} 
1

私は自分の考えを示すために小さなユニットテストを作成しようとしました。基本的に現在選択されているノードを取得し、その親を再帰的にトラバースします。

private bool IsParentOf(XmlNode parentNode, XmlNode node) 
    { 
     if (node.ParentNode == null) return false; 
     return node.ParentNode == parentNode || IsParentOf(parentNode, node.ParentNode); 
    } 
    [TestMethod] 
    public void TestMethod1() 
    { 
     string xml = 
       @" 
      <MenuItem Name=""MenuItem 1"" Url=""MenuItem1.aspx""/> 
      <MenuItem Name=""MenuItem 2"" Url=""MenuItem2.aspx""> 
       <MenuItem Name=""MenuItem 3"" Url=""MenuItem3.aspx"" /> 
      </MenuItem> 
      <MenuItem Name=""MenuItem4"" Url=""MenuItem4.asp"" />"; 
     string url = "MenuItem3.aspx"; 

     XmlDocument doc = new XmlDocument(); 
     doc.LoadXml("<MenuItems>" + xml + "</MenuItems>"); 
     var xPathFormat = "//MenuItem[@Url='{0}']"; 
     var currentNode = doc.SelectSingleNode(string.Format(xPathFormat, url)); 

     var menuItem1 = doc.SelectSingleNode(string.Format(xPathFormat, "MenuItem1.aspx")); 
     Assert.IsFalse(IsParentOf(menuItem1, currentNode)); 

     var menuItem2 = doc.SelectSingleNode(string.Format(xPathFormat, "MenuItem2.aspx")); 
     Assert.IsTrue(IsParentOf(menuItem2, currentNode)); 

    } 
関連する問題