如何从C#中的选定XML节点获取所有属性名称

时间:2017-01-10 08:34:42

标签: c# xml tags xmlreader

这是我的XML文件。我需要选择一个测试元素并从其结果子节点获取所有属性名称。

<?xml version="1.0" encoding="UTF-8"?>
<summary>
  <test>
    <id>test 1</id>   
    <result value="-45">330</result>
    <result value="0">300</result>
    <result value="45">340</result>
  </test>
  <test>
    <id>test 3</id>    
    <result value="-45">330</result>
    <result value="0">300</result>
    <result value="45">340</result>
  </test>
</summary>

我在下面写了代码。但重复相同的值,我想阻止它。

XmlDocument xd = new XmlDocument();
xd.Load(_xmlFilePath);

XmlNodeList nodelist = xd.GetElementsByTagName("result");

foreach (XmlNode node in nodelist)
    {
        string attrVal = node.Attributes["value"].Value;
        Console.WriteLine(attrVal);
    }

任何建议都表示赞赏。

感谢。

2 个答案:

答案 0 :(得分:2)

您可以将LINQ to Xml与XDocument

一起使用
var doc = XDocument.Load(_xmlFilePath);

var distinctResults = doc.Descendants("result")
                         .Select(element => element.Attribute("value").Value)
                         .Distinct();

foreach(var result in distinctResults)
{
    Console.WriteLine(result);
}

或使用HashSet<string>

var results = doc.Descendants("result")
                 .Select(element => element.Attribute("value").Value);

var distinctResults = new HashSet<string>(results); 

foreach(var result in distinctResults)
{
    Console.WriteLine(result);
}

答案 1 :(得分:0)

请尝试以下操作:

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

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

            XDocument doc = XDocument.Load(FILENAME);

            string id = "test 1";

            var results = doc.Descendants("test").Where(x => (string)x.Element("id") == id).FirstOrDefault().Elements("result").Select(x => new
            {
                angle = (int)x.Attribute("value"),
                length = (int)x
            }).ToList();

        }


    }


}