使用LINQ to XML访问XML中的元素类型

时间:2014-08-20 10:33:01

标签: c# xml linq

如下面的代码片段所示,XML文件中每个元素的名称各不相同。元素1的类型为testcheck1,元素2的类型为testcheck2.

<?xml version="1.0" encoding="utf-16"?>

<Tests xmlns="urn:lst-emp:emp">

  <testcheck1 xmlns="">
    <Type>string</Type>
    <Value>value1</Value>
  </testcheck1>

  <testcheck2 xmlns="">
    <Type>int</Type>
    <Value>1232</Value>
  </testcheck2>

</Tests>

我可以使用此代码:

XElement xelement = XElement.Load("project_data.xml");
IEnumerable<XElement> employees = xelement.Elements();
Console.WriteLine("List of all Values:");
foreach (var employee in employees)
{
    StreamWriter file2 = new StreamWriter("C:\\tempFolder\\results.xml", true);
    file2.WriteLine(employee.Element("Value").Value);
    file2.Close();
}

获取XML文件中的每个值。 (例如value11232)。

我想知道是否有可能使用LINQ to XML获取我在XML中定义的元素类型(如testcheck1testcheck2)。

2 个答案:

答案 0 :(得分:2)

听起来你真的只是在寻找元素名称,可能是LocalName

var root = XElement.Load("project_data.xml");
foreach (var element in root.Elements())
{
    Console.WriteLine("{0}: {1}", 
                      element.Name.LocalName,
                      element.Element("Value").Value);
}

(当你Type子元素时,谈论&#34;类型&#34;元素有点令人困惑,请注意......)

那将打印出来:

testcheck1: value1
testcheck2: 1232

答案 1 :(得分:1)

您可以将Type元素与Value元素相同:

foreach (var employee in employees)
{
    StreamWriter file2 = new StreamWriter("C:\\tempFolder\\results.xml", true);
    var value = (string)employee.Element("Value");
    var type = (string)employee.Element("Type");
    var name = e.Name.LocalName;
    // ...
}

您还可以创建匿名&#39;员工&#39;具有值和类型的对象:

var employees = from e in xelement.Elements()
                select new {
                   Name = e.Name.LocalName,
                   Type = (string)e.Element("Type"),
                   Value = (string)e.Element("Value")
                };

foreach (var employee in employees)
{
    // use employee.Name, employee.Type and employee.Value
}