从XML中分解元素树

时间:2017-06-21 07:47:23

标签: c# xml linq visual-studio-2015

我有一个XML,我尝试分解元素,以便显示每个元素的路径。我已经给出了下面代码的示例以及我想要看到的输出。

XML数据如下所示。

<a:Clients> 
    <a:Client1>
        <a:Initial>
          <a:FirstName>data</a:FirstName>
          <a:LastName>data</a:LastName>
        </a:Initial>
        <a:FirstName>data</a:FirstName>
        <a:MiddleName />
        <a:LastName>data</a:LastName>
        <a:Title>Mr</a:Title>
        <a:MaritalStatus>Divorced</a:MaritalStatus>
        <a:MaidenName>data</a:MaidenName>

我想输出它显示为

客户/客户端1

Clients / Client1 / Initilal

客户/客户端1 /初始/姓

等所以我想让我的xml的所有元素按照这个顺序出现在一个大的XML文档中。我不想要任何位于标签之间的数据,只需要元素路径。

我在vs 2015中编写了以下代码 - 控制台应用程序尝试按此顺序输出但是它无法正常工作。我正在使用的c#代码是:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Xml;
using System.Xml.Linq;
using System.Xml.XPath;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            XNamespace ns = "http://www.test.net/author/1.0";
            XDocument doc = XDocument.Load("test.xml");
            var allElements  = doc.Descendants();
           foreach (var element in allElements)
           Console.WriteLine(allElements);
           Console.ReadLine();
        }
    }
}

我目前获得的输出是:

Output

我已经查看了Stack Overflow的答案,但似乎没有什么是我需要的,我尝试过的也没有用。不确定是否有更简单的方法来做到这一点?

非常感谢帮助

1 个答案:

答案 0 :(得分:0)

我设法以相反的顺序执行:

客户端1 /客户

所以我刚进入一个列表并以相反的顺序打印出来,以便顺序排列。

        XDocument doc = XDocument.Load("test.xml");
        var allElements = doc.Descendants();
        var elemants = doc.Elements();

        foreach (var element in allElements)
        {
            var current = element;
            List<string> names = new List<string>();
            while (current.Parent != null)
            {
                names.Add(current.Name.LocalName);
                current = current.Parent;
            }
            names.Add(current.Name.LocalName);
            names.Reverse();
            foreach(var name in names)
                Console.Write(name + "/");
            Console.WriteLine();
        }

我希望那就是你所需要的。