我正在使用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");
但这不起作用。如何将这些属性添加到数组中?
答案 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);
}