public SimpleElement parse(XmlTextReader reader) { SimpleElement se = null; this.Reader = reader; while (!Reader.EOF) { Reader.Read(); switch (Reader.NodeType) { case XmlNodeType.Element : // create a new SimpleElement se = new SimpleElement(Reader.LocalName); currentElement = se; if (elements.Count == 0) { rootElement = se; elements.Push(se); } else { SimpleElement parent = (SimpleElement) elements.Peek(); parent.ChildElements.Add(se); // don['t push empty elements onto the stack if (Reader.IsEmptyElement) // ends with "/>" { break; } else { elements.Push(se); } } if (Reader.HasAttributes) { while(Reader.MoveToNextAttribute()) { currentElement.setAttribute(Reader.Name,Reader.Value); } } break; case XmlNodeType.Attribute : se.setAttribute(Reader.Name,Reader.Value); break; case XmlNodeType.EndElement : //pop the top element elements.Pop(); break; case XmlNodeType.Text : currentElement.Text=Reader.Value; break; case XmlNodeType.CDATA : currentElement.Text=Reader.Value; break; default : // ignore break; } } return rootElement; }
private static void printTree(SimpleElement se, StringBuilder sb, int depth) { sb.Append(new string('\t',depth) + "<" + se.TagName); foreach (string attName in se.Attributes.Keys) { sb.Append(" " + attName + "=" + "\"" + se.Attribute(attName) + "\""); } sb.Append(">" + se.Text.Trim()); if (se.ChildElements.Count > 0) { sb.Append(System.Environment.NewLine); depth +=1; foreach(SimpleElement ch in se.ChildElements) { //sb.Append(System.Environment.NewLine); printTree(ch, sb, depth); } depth -= 1; sb.Append(new string('\t',depth) + "</" + se.TagName + ">" + System.Environment.NewLine); } else { sb.Append("</" + se.TagName + ">" + System.Environment.NewLine); } }
static void Main() { int starttick; int endtick; int i; XmlTextReader rdr; StringBuilder sb; SimpleElement se = new SimpleElement("junk"); SimpleDOMParser sdp; sb = new StringBuilder(); try { starttick = System.Environment.TickCount; for (i=0; i < 10; i++) { rdr = new XmlTextReader(@"c:\rjones\temp\employees.xml"); sdp = new SimpleDOMParser(); se = sdp.parse(rdr); rdr.Close(); } endtick = System.Environment.TickCount; sb = new StringBuilder(); printTree(se, sb, 0); System.Diagnostics.Debug.WriteLine(sb.ToString()); System.Diagnostics.Debug.WriteLine(endtick - starttick); } catch (Exception ex) { System.Diagnostics.Debug.WriteLine(ex.Message); } }
public SimpleDOMParser() { elements = new Stack(); currentElement = null; }
public void Add(SimpleElement se) { this.List.Add(se); }