【问题标题】:Linq to Xml : highlighting respective child nodes upon selecting parent nodeLinq to Xml:在选择父节点时突出显示相应的子节点
【发布时间】:2015-06-02 19:20:45
【问题描述】:

我正在处理 LINQ to XML 查询,如果我选择分支(父节点),则只有特定于该分支的子节点应该突出显示。 我正在开发一个 ASP.NET 工具,因为我需要读取一个 XML 文件,它首先读取父节点,根据用户选择,它将读取子节点,现在的问题是如果我选择父节点,它正在读取所有父节点的所有子节点,所以我需要一个查询,它应该在选择分支时读取相应的子节点

<branch name="TigerDrop">
   <milestones>
     <milestone name="BETA1"></milestone>
     <milestone name="BETA2"></milestone>
   </milestones>
</branch>
<branch name="EagleDrop">
   <milestones>
     <milestone name="RFLD"></milestone>
     <milestone name="RFVD"></milestone>
   </milestones>
</branch>
<branch name="LionDrop">
   <milestones>
     <milestone name="WIP2"></milestone>
     <milestone name="WIP3"></milestone>
   </milestones>
</branch>

我试过这样,

public List<string> GetMilestones()
{
   string inputFilePath = Server.MapPath(@"~/DropList.xml");
   var elements = XDocument.Load(inputFilePath);
   var result = (from item in elements.Descendants("milestones").Descendants("milestone").Where(item => (string) item == "branch")
       .SelectMany(item => item.Parent.Elements("milestones").Elements("milestone"))).ToList();

    return result;
}

【问题讨论】:

  • 对于信息,就像如果我选择 LionDrop 分支,里程碑字段应该只突出 WIP2 和 WIP3,而不是其他里程碑
  • 那个 XML 无效 -- 它缺少一个 root element

标签: c# xml linq-to-xml


【解决方案1】:

您可以使用以下 LINQ 查询来完成:

    public static List<string> GetMilestoneNames(XDocument doc, string branchName)
    {
        var query = doc.Root.Descendants("branch")
            .Where(e => e.Attributes("name").Any(a => a.Value == branchName))
            .Elements("milestones")
            .Elements("milestone")
            .Attributes("name").Select(a => a.Value);

        return query.ToList();
    }

或使用以下XPath 查询:

    public static List<string> GetMilestoneNames(XDocument doc, string branchName)
    {
        var query = (IEnumerable)doc.XPathEvaluate(string.Format("//branch[@name='{0}']/milestones/milestone/@name", branchName));
        return query.Cast<XAttribute>().Select(a => a.Value).ToList();
    }

【讨论】:

  • 它对我有用,我使用了上述解决方案并根据我的环境进行了修改...非常感谢 dbc
【解决方案2】:

试试这个

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = 
               "<Root>" +
                "<branch name=\"TigerDrop\">" +
                   "<milestones>" +
                     "<milestone name=\"BETA1\"></milestone>" +
                     "<milestone name=\"BETA2\"></milestone>" +
                   "</milestones>" +
                "</branch>" +
                "<branch name=\"EagleDrop\">" +
                   "<milestones>" +
                     "<milestone name=\"RFLD\"></milestone>" +
                     "<milestone name=\"RFVD\"></milestone>" +
                   "</milestones>" +
                "</branch>" +
                "<branch name=\"LionDrop\">" +
                   "<milestones>" +
                     "<milestone name=\"WIP2\"></milestone>" +
                     "<milestone name=\"WIP3\"></milestone>" +
                   "</milestones>" +
                "</branch>" +
                "</Root>";

            XDocument elements = XDocument.Parse(input);
            string parent = "TigerDrop";
            List<XElement> result = elements.Descendants("branch").Where(item => item.Attribute("name").Value == parent).Descendants("milestone").ToList();

        }
    }
}
​

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多