如何从xml文件中的同一元素中获取两个属性,比较它们并按数字顺序对它们进行排序?
XML元素是:
<Parent>
<Nice to="647429920" from="20200935" />
<Nice to="647431008" from="20200969" />
<Nice to="647432224" from="20201007" />
<Nice to="647437984" from="20201187" />
<Nice to="647441632" from="20201301" />
<Nice to="647441760" from="20201305" />
<Nice to="647443360" from="20201355" />
<Nice to="647445728" from="20201429" />
<Nice to="647446144" from="20201442" />
<Nice to="647447296" from="20201478" />
<Nice to="647450400" from="20201575" />
<Nice to="647450752" from="20201586" />
<Nice to="647451232" from="20201601" />
</Parent>
我试图将此作为获取属性的开始:
foreach (XElement node in xDoc.DocumentElement)
{
Console.Write(node.Element("Nice").Attribute("to").Value);
Console.Write(node.Element("Nice").Attribute("from").Value);
Console.WriteLine(node.Element("Entry").Attribute("from").Value);
}
这会导致Cast异常。
编辑:
更新至:
var xDoc1 = XDocument.Load(xmlPath);
foreach (XElement node in xDoc1.Elements())
{
Console.WriteLine(node.Element("Nice").Attribute("to").Value);
Console.WriteLine(node.Element("Nice").Attribute("from").Value);
}
但是正文中的代码只能读取一次,然后程序退出。它不会遍历整个xml文件。
答案 0 :(得分:1)
也许您正在尝试投射&#39; Xml.XmlElement&#39;从&#39; DocumentElement&#39;返回到了Linq.XElement&#39;。
可能你需要这样的东西:
var xDoc = new XmlDocument();
var orderedList = new List<int>();
xDoc.Load(/* xml path */);
var els = xDoc.GetElementsByTagName("Nice").Cast<XmlNode>();
foreach (var el in els)
{
Console.WriteLine(el.Attributes.Item(0).Value);
Console.WriteLine(el.Attributes.Item(1).Value);
}
或此代码,如果您想使用xml.linq
@Ed Plunkett提示后编辑
var xDoc1 = XDocument.Load(/* xml path */);
var nodes = xDoc1.Elements("Parent").Elements("Nice");
if(nodes != null && nodes.Any())
{
foreach (XElement node in nodes)
{
orderedList.Add(int.Parse(node.Attribute("to").Value));
orderedList.Add(int.Parse(node.Attribute("from").Value));
}
}
orderedList.Sort();
foreach (var a in orderedList)
{
Console.WriteLine(a);
}
Console.ReadLine();
答案 1 :(得分:1)
Daniele's Answer Works但是可能存在一些问题,使用linq可以跳过foreach循环:
首先,您的值看起来像整数,因此使用Value而不将其解析为整数会导致问题(比较字符串"10" < "2"
时的IE)。
其次,没有空检查以查看属性是否存在,这将抛出空引用异常。
var xDoc1 = XDocument.Load(/* xml path */);
var nodes = xDoc1.Root.Elements("Nice");
var values = nodes
.Where(n => n.Attributes().Any(a => a.Name == "to"))
.Select(n => {
int result;
int.TryParse(n.Attributes().First(a => a.Name == "to").Value, out result);
return result;
})
.ToList();
values.AddRange(nodes
.Where(n => n.Attributes().Any(a => a.Name == "from"))
.Select(n => {
int result;
int.TryParse(n.Attributes().First(a => a.Name == "from").Value, out result);
return result;
})
.ToList());
values = values.OrderBy(n => n).ToList();