[英]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.