2010-08-18 68 views
0

我们希望找到节点在XML文档中具有的最大属性数。我的代码如下使用C#:节点在XML文档中具有的最大属性数

 XmlDocument xmlDoc = new XmlDocument(); 
     xmlDoc.Load(@"C:\ABC.xml"); 
     XmlNode root = xmlDoc.DocumentElement; 

     int nodeAttrCount = 0; 
     foreach (XmlNode node in root)        
      if (nodeAttrCount < node.Attributes.Count) 
       nodeAttrCount = node.Attributes.Count; 

我们感兴趣的是:我们有什么比这更好的东西。就像给我们相同结果或任何其他选择的任何方法或属性一样。

+0

[插入有关使用LINQ与.Max(n => n.Attributes.Count)的注释] [插入回复评论,说LINQ过度杀伤] – 2010-08-18 10:45:54

回答

0

您还可以使用LINQ到XML:

XElement el = XElement.Load("MyXML.xml"); 
int maxAttr = el.DescendantNodesAndSelf().OfType<XElement>().Max(x => x.Attributes().Count()); 

上面的代码遍历所有的XML节点(其工作原理与嵌套的节点也是如此),并得到属性的最大数量。


对于.NET 2.0:

XmlDocument doc = new XmlDocument(); 
doc.Load("MyXML.xml"); 
int max = 0; 
foreach (XmlNode xmlNode in doc.SelectNodes("//*")) 
    if (max < node.Attributes.Count) 
     max = node.Attributes.Count; 

这基本上是与您的溶液; 主要区别在于它考虑了每个嵌套级别的所有节点(使用XPath导航)。

+0

感谢您的代码,但不工作。给出错误'>'作为无效表达式。不识别“Max(x => x.Attributes()。Count()”。 – Malik 2010-08-18 10:57:35

+0

Mmh真的很奇怪,我刚才测试了相同的代码,它工作正常(我的目标是.NET 3.5)。 System.Linq;“ – digEmAll 2010-08-18 11:08:46

+0

谢谢,但我们的生产服务器仍在运行.Net 2.0 :( – Malik 2010-08-19 05:27:16

0

这是三行代码的一个相当利基的要求。我不希望这已经存在于.NET框架中。

您的foreach循环看起来不错。您确定只想查看根元素,而不是在文档内部递归?

+0

我们不需要在文档内部进行递归。实际上,我们的XML是这样的: 。 。 。 。 。 听起来好吗? – Malik 2010-08-18 10:20:33

+0

你的代码看起来很好 - 我会写同样的东西 – 2010-08-18 10:22:48