in src/XmlStats/XmlStats.cs [240:338]
public void Process(XmlTextReader r)
{
if (r == null)
{
return;
}
r.WhitespaceHandling = this._whiteSpace;
Stack elementStack = new Stack();
NodeStats currentElement = null;
while (r.Read())
{
switch (r.NodeType)
{
case XmlNodeType.CDATA:
case XmlNodeType.Text:
{
long len = r.Value.Length;
currentElement.Chars += len;
this._elemChars += len;
break;
}
case XmlNodeType.Element:
this._elemCount++;
if (r.IsEmptyElement)
{
this._emptyCount++;
}
NodeStats es = CountNode(this._elements, r.Name);
elementStack.Push(es);
currentElement = es;
while (r.MoveToNextAttribute())
{
if (es.Attrs == null)
{
es.Attrs = new Dictionary<string, NodeStats>();
}
var attrs = es.Attrs;
this._attrCount++;
// create a name that makes attributes unique to their parent elements
NodeStats ns = CountNode(attrs, r.Name);
string s = r.Value;
if (s != null)
{
long len = r.Value.Length;
ns.Chars += len;
this._attrChars += len;
}
}
break;
case XmlNodeType.EndElement:
currentElement = (NodeStats)elementStack.Pop();
break;
case XmlNodeType.Entity:
break;
case XmlNodeType.EndEntity:
break;
case XmlNodeType.EntityReference:
// if you want entity references expanded then use the XmlValidatingReader.
// or perhaps we should report a list of them!
break;
case XmlNodeType.ProcessingInstruction:
this._piCount++;
this._piChars += r.Value.Length;
break;
case XmlNodeType.Comment:
this._commentCount++;
this._commentChars += r.Value.Length;
break;
case XmlNodeType.SignificantWhitespace:
this._whiteSChars += r.Value.Length;
break;
case XmlNodeType.Whitespace:
this._whiteChars += r.Value.Length;
break;
case XmlNodeType.None:
break;
case XmlNodeType.Notation:
break;
case XmlNodeType.XmlDeclaration:
break;
case XmlNodeType.Document:
break;
case XmlNodeType.DocumentFragment:
break;
case XmlNodeType.DocumentType:
break;
}
}
r.Close();
}