在C#中使用XML属性创建数组

时间:2011-10-19 00:37:08

标签: c# xml

我正在使用C#来处理具有重复结构的XML文件。伪文件如下:

<Root>
    <Element attribute=1> 123 </Element>
    <Element attribute=2> 456 </Element>
    <Element attribute=3> 789 </Element>
</Root>

我正在尝试同时使用所有这些数据。我想出了(在经过多次实验和阅读之后)如何将每个数据中的所有数据写入(排序)数组以便以后轻松访问。现在,我刚刚将这些数据打印到控制台以进行调试:

XmlNodeList values = xmlDoc.GetElementsByTagName("Element");

for (int i=0; i <= values.Count; i++)
        {   
            Console.WriteLine(values[i].InnerText);
        } 

那部分效果很好。现在,我正试图以类似的方式访问属性,而这只是没有淘汰。经过一番搜索,我想出了

values = xmlDoc.GetElementsByTagName("Element").GetAttribute("attribute");

但这不起作用。如何将这些属性添加到数组中?

4 个答案:

答案 0 :(得分:1)

属性名称区分大小写,就像XML中的其他所有内容一样。因此,请尝试使用attribute,看看是否有效。

答案 1 :(得分:1)

您无法在GetAttribute("Attribute")之后应用GetElementsByTagName("Element"),因为它的XmlNodeList类型不包含GetAttribute方法(实际上因为它代表列表,而不是元素) 。您必须分别从每个元素获取属性。

这里是如何使用LINQ(.NET 3.5和更高版本)来完成的:

var list = from XmlNode element in xmlDoc.GetElementsByTagName("Element")
           select element.Attributes["attribute"].Value;

或使用方法:

var list = xmlDoc.GetElementsByTagName("Element")
                 .Cast<XmlNode>()
                 .Select(e => e.Attributes["attribute"].Value);

输出结果:

foreach (var attribute in list)
    Console.WriteLine(attribute);

P.S。循环中的条件i <= values.Count包含错误。应该是i < values.Count。为此目的,最好使用foreach

答案 2 :(得分:1)

嗯,您必须以与打印值类似的方式收集所有属性:

List<string> attributes = new List<string>();
XmlNodeList elemList = doc.GetElementsByTagName("Element");
for (int i = 0; i < elemList.Count; i++)
{   
     attributes.Add(elemList[i].Attributes["attribute"].Value);
}  

如果您使用.NET 3.5或更高版本,那么您可以使用Linq来缩短它:

var attributes = doc.GetElementsByTagName("Element").Select(e => e.Attributes["attribute"].Value).ToList();

答案 3 :(得分:1)

首先,XML是区分大小写的,正如其他人所说的那样。

其次,您尝试访问元素枚举的单个属性。

xmlDoc.GetElementsByTagName("Element").GetAttribute("Attribute");

Document.ManyElements.SingleAttribute // The cardinality doesn't make sense here.

应该是

foreach(var element in Document.ManyElements)
{
    Console.WriteLine(element.SingleAttribute)
}

第三,如果你能够设法正确地格式化你的XML,我强烈建议使用Linq To XML来实现这一目标。它的使用方式更清晰。

var myXmlText = @"<Root><Element attribute='1'>123</Element></Root>";
var doc = XElement.Parse(myXmlText);

var values = doc.Elements("Element")
                .Attributes("attribute")
                .Select(x => x.Value);

foreach(var value in values)
{
    Console.WriteLine(value);
}