1

私は次のxmlを持っています:

<?xml version="1.0" encoding="utf-8" ?>
<layout>
  <menu name="Employees" url="Employees.aspx" admin="0">
  </menu>
  <menu name="Projects" url="Projects.aspx" admin="1">
  </menu>
  <menu name="Cases" url="Cases.aspx" admin="1">
  </menu>
  <menu name="CaseView" url="CaseView.aspx" admin="1" hidden="1" parent="Projects">
  </menu>
  <menu name="Management" url="" admin="1">
    <item name="Groups" url="Groups.aspx" admin="1" parent="Management"/>
    <item name="Statuses" url="Statuses.aspx" admin="1"/>
  </menu>
</layout>

ここに、「親」属性を持つ CaseView とグループがあります。

現在、私は次のように繰り返します:

IEnumerable<XElement> menus =
            doc.Element("layout").Elements();

            foreach (var menu in menus)
            {
                     string name = menu.Attribute("name").Value;
                string active = "";
                string url = menu.Attribute("url").Value;
                if(activePage == url)
                {
                    active = "class=\"active\"";
                }
                ...

私が欲しいのは:

        if(activePage == url || ActiveIsChildOf(name, activePage))
        {
            active = "class=\"active\"";
        }

基本的に、このメソッドは、url 属性として activePage を持つ要素が存在するかどうかを検出する必要があります。存在する場合は、parent 属性があるかどうかを確認します。存在する場合は、親 == 名前かどうかを確認してください。

属性などで要素を見つける方法はありますか? 元:

XElement e = doc.GetByAttribute("url",activePage)

ありがとう

4

5 に答える 5

1

Linq to XMLを使用しているので、Descendantsメソッドを使用できます。これは、直接の子だけでなく、すべての子要素を返します。その後、LINQを使用して結果をフィルタリングできます。

XDocument doc;
string activePage;
var activeMenu = doc.Descendants("menu")
     .FirstOrDefault(o => o.Attribute("url").Value == activePage);

ソースXMLがすべてのメニュー要素に対してそのような属性を持っていないことを保証できない場合は、o.Attribute("url")返されないかどうか(属性が存在しない場合に返される)を確認する必要がある場合があります。null

引数をスキップして、Descendants()すべての要素をチェックすることもできます。サンプルデータでは、メニュー要素とアイテム要素の両方をチェックできます。例えば:

var activeMenu = doc.Descendants()
     .Where(o => o.Name == "menu" || o.Name == "item")
     .FirstOrDefault(o => o.Attribute("url").Value == activePage);
于 2013-02-19T17:20:36.957 に答える
1

xpath が難解すぎる場合は、LINQ を使用できます。

IEnumerable<XElement> hits =
        (from el in XMLDoc.root.Elements("item")
         where (string)el.Attribute("url") == activePage
         select el);

またはこのように:

XElement xml = XElement.Load(file);
XElement xele = xml.Elements("item").FirstOrDefault(e => ((string)e.Attribute("url")) == activePage);
if(null != xele ) 
{
    // do something with it
}

そして、おそらく大文字と小文字を区別しないでください:

XElement xml = XElement.Load(file);
XElement xele = xml.Elements("item").FirstOrDefault(e => StringComparer.OrdinalIgnoreCase.Equals((string)e.Attribute("url") , activePage));
if(null != xele ) 
{
    // do something with it
}

メニューとアイテムの両方が必要な場合は、これを使用します。

XElement xml = XElement.Load(file);
XElement xele = xml.Elements().FirstOrDefault(e => StringComparer.OrdinalIgnoreCase.Equals((string)e.Attribute("url") , activePage));
if(null != xele ) 
{
    // do something with it
}
于 2013-02-19T17:12:15.067 に答える
0

単に使用できますxPath。のクエリ言語ですXML

あなたはこのようなものを定式化することができます:

var xDoc = new XmlDocument();
xDoc.Load("XmlFile.xml");

//Fetch your node here 
XmlNode = xDoc.SelectSingleNode(/layout/menu[@url='activepage'][1]);

ノードのセットを返し、インデックス1は指定されたセットの最初のノードを取得します。

xDoc.SelectNodes一致するすべてのノードが必要な場合は、いつでも使用できます。


を使用しているので、またはを使用してノードをLINQ含めるだけで選択できます。System.Xml.XPathXPathSelectElementXPathSelectElements

于 2013-02-19T17:07:10.537 に答える
0

xml を辞書に変換する、大文字と小文字を区別しない検索の例:

Dim expandos = XDocument.Parse(Request("Xml")).Root.Elements.Select(
    Function(e)
        Dim expando As Object = New ExpandoObject,
            dic = e.Attributes.ToDictionary(Function(a) a.Name.LocalName, Function(a) a.Value,
                StringComparer.InvariantCultureIgnoreCase)
        expando.PedidoId = dic("PedidoId")
        expando.FichaTecnicaModeloId = dic("FichaTecnicaModeloId")
        expando.Comodo = dic("Comodo")
        expando.Cliente = dic("Cliente")
        Return expando
    End Function)
于 2015-04-24T13:25:55.503 に答える
0

XPathでそれを行うことができます:

doc.SelectNodes("//*[@url='" + activePage + "']")

as属性を持つすべてのドキュメントアイテムを返します。activePageurl

于 2013-02-19T17:15:56.657 に答える