在C#中创建一个具有XML属性的数组

本文关键字:XML 属性 数组 一个 创建 | 更新日期: 2023-09-27 18:11:43

我使用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");

但那没用。如何将这些属性添加到数组中?

在C#中创建一个具有XML属性的数组

首先,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,我强烈建议您在这方面使用LinqToXML。它使用起来更干净。

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);
}

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

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

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();

不能在GetElementsByTagName("Element")之后应用GetAttribute("Attribute"),因为它的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);

附言:循环中的条件i <= values.Count包含错误。应为i < values.Count。最好使用foreach