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