在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");
但那没用。如何将这些属性添加到数组中?
首先,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
。