繁体   English   中英

获取从父节点到最后一个子节点的XML标签属性值

[英]Get XML tag attribute value from parent node to last child node

这是我的输入XML

<?xml version="1.0" encoding="UTF-8"?>
<Menu TextField="Menu">
   <Menu TextField="Approvals">
      <Menu TextField="Vacation/Leave">
         <Menu TextField="Vacation Pre-Request Approval" />
         <Menu TextField="Vacation Approval" />
      </Menu>
      <Menu TextField="Late Come Approval" />
      <Menu TextField="Loan Approval" />
      <Menu TextField="Department Change Approval" />
      <Menu TextField="Resignation/Termination">
         <Menu TextField="Resignation Approval" />
         <Menu TextField="Resignation Clearance" />
      </Menu>
   </Menu>
   <Menu TextField="Employee Transactions">
      <Menu TextField="Change Designation" />
      <Menu TextField="Organization">
         <Menu TextField="Organization Designation & Grade" />
      </Menu>
      <Menu TextField="Change Grade" />
   </Menu>
</Menu>

我将提取TextField并形成如下字符串:

Approvals > Vacation/Leave > Vacation Pre-Request Approval
Approvals > Vacation/Leave > Vacation Approval
Approvals > Late Come Approval
Approvals > Loan Approval
Approvals > Department Change Approval
Approvals > Resignation/Termination > Resignation Approval
Approvals > Resignation/Termination > Resignation Clearance
Employee Transactions > Change Designation
Employee Transactions > Organization > Organization Designation & Grade
Employee Transactions > Change Grade

我将在字符串中打印TextField的第一个标签值,直到TextField的最后一个标签值。 下面是我尝试过的代码,但这些代码以我所需的结构格式打印了所有TextField值。

var menus = (from menu in XDocument.Parse(xml).Descendants("Menu")
            select new
                {
                    TextField = (string)menu.Attribute("TextField")
                }).ToList();

试试这个linq xml查询。 确保将“&”替换为“&amp;”

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



namespace ConsoleApplication29
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            XDocument doc = XDocument.Load(FILENAME);

            XElement menu = doc.Descendants().Where(x => (string)x.Attribute("TextField") == "Menu").FirstOrDefault();
            foreach (XElement element in menu.Elements())
            {
                string textField = (string)element.Attribute("TextField");
                foreach (XElement subElement in element.Elements())
                {
                    List<string> textStrings = subElement.DescendantNodesAndSelf().Select(x => (string)((XElement)x).Attribute("TextField")).ToList();
                    textStrings.Insert(0, textField);
                    Console.WriteLine(string.Join(" > ", textStrings));
                }
            }
            Console.ReadLine();
        }
    }

}

如果您想与菜单无关,可以进行递归:

IEnumerable<string> GetMenuTexts(XElement menuElement) {
    string ownText = menuElement.Attribute("TextField").Value;
    if (!menuElement.Elements("Menu").Any()) {
        return new string[] { ownText };
    }
    else {
        var menus =
            from subMenuElement in menuElement.Elements("Menu")
            from menuText in GetMenuTexts(subMenuElement)
            select ownText + " > " + menuText;
        return menus;
    }
}

您可以这样调用递归方法:

var menus = (from menuText in GetMenuTexts(XDocument.Parse(xml).Root)
            select new
                {
                    TextField = menuText
                }).ToList();

如果您不想打印根菜单,则必须从根目录下的元素开始:

var menus = (from menuElement in XDocument.Parse(xml).Root.Elements("Menu")
            from menuText in GetMenuTexts(menuElement)
            select new
                {
                    TextField = menuText
                }).ToList();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM