如何使用C#确定XML文档的属性计数

时间:2009-05-28 19:00:45

标签: c# xml

我正在使用XmlReader和xml导航器,如下所示:

XmlDocument doc = new XmlDocument();
doc.Load(txtFileName.Text.Trim());
// Create the navigator.

XPathNavigator xnav = doc.CreateNavigator();

创建导航后,您可以选择后代或子项,然后您可以确定子项的数量。但是,我有问题,当我需要知道该节点的属性数量时我不能,例如,如果你想知道你使用以下代码的孩子数量。

int size = xnav.SelectDescendants(XPathNodeType.All, true).Count;

在这种情况下,此函数接受两个参数:要选择的节点类型,如文本注释或元素,如果希望选择此子树的根,即当前节点,则将第二个参数设置为true以及子树的一部分。

select[*]的结果是XPathIterator对象。

当然你不想要一般的注释或空格数,所以你不要使用all属性来检索所有节点,但你需要指定你想要的节点类型让我们说我们需要所有的元素,属性和文本因此我们应该运行以下命令:

int size = xnav.SelectDescendants(XPathNodeType.Attribute | XPathNodeType.Element | XPathNodeType.Text , true).Count;

我认为您需要对属性的值进行计数,因此您必须将属性的结果加倍,因为它不能像这样指定节点的类型,所以我做了以下内容:

int size = (xnav.SelectDescendants(XPathNodeType.Attribute, true).Count * 2) +
    xnav.SelectDescendants(XPathNodeType.Element, true).Count +
    xnav.SelectDescendants(XPathNodeType.Text , true).Count;

目前我拥有以上所有的计数,但属性我没有计算。

HEEELLLPPP !!!请

P.S。我不想经历循环到元素这样做是非常昂贵的。

3 个答案:

答案 0 :(得分:1)

如果您真的担心性能,则应该使用XmlReader直接执行此操作,而不是执行所有这些XPath查询。它还可以让您一次跟踪所有计数,而不是执行多个文档范围的查询。

答案 1 :(得分:0)

我将从字符串

手动完成
<img src="" style="" width=""/>

只计算“=”符号即可

答案 2 :(得分:0)

您可以使用xpath查找有多少属性

XmlDocument doc = new XmlDocument();
doc.Load(txtFileName.Text.Trim());
XPathNavigator xnav = doc.CreateNavigator();
xnav.Evaluate("count(//@*)");