使用xmltextreader对xml文件进行简单的以对象形式的读取和写入操作 BaseSerializeElement ------------------------------------------------------------- using System; using System.Xml; using System.Collections; namespace Local.Framework.Common { /// <summary> /// BaseXmlSerializer 的摘要说明。 /// --fallseir.li 20050427 15:12 /// </summary> public class BaseSerializeElement { public BaseSerializeElement() { } public BaseSerializeElement(XmlReader reader,bool isroot) { this._isroot=isroot; ReadXml(reader,isroot); } public BaseSerializeElement(XmlReader reader):this(reader,false){} #region attributes public bool IsRoot { get{return _isroot;} } private bool _isroot; public string TAG { get{return _tag;} } private string _tag; public string Value { get{return _value;} } public string _value; public string CData { get{return _cdata;} } private string _cdata; public ArrayList Elements { get{return _elements;} } private ArrayList _elements; public Hashtable Attributes { get { return _attributes; } } private Hashtable _attributes; private string _prefix; private string _namespaceuri; private string _xmllang; //private string _xmlspace; private string _baseuri; //private XmlNameTable _nametable; //root private string _declaration; private string _documenttype; #endregion public void AddAttribute(string key,string value) { if(_attributes==null) _attributes=new Hashtable(); if(_attributes.ContainsKey(key)) { _attributes[key]=value; } else { _attributes.Add(key,value); } } public void AddElement(BaseSerializeElement element) { if(_elements==null) _elements=new ArrayList(); _elements.Add(element); } #region IXmlSerializable 成员 public void WirteXmlRoot(XmlWriter writer) { writeRoot(writer); WriteXml(writer); } private void writeRoot(XmlWriter writer) { writer.WriteProcessingInstruction("xml",this._declaration); // writer.WriteDocType } public void WriteXml(XmlWriter writer) { if(this._prefix!="") writer.WriteStartElement(this._prefix+":"+TAG); else writer.WriteStartElement(TAG); //if(this._nametable!=null) if(Attributes!=null) { foreach(object key in Attributes.Keys) { writer.WriteAttributeString(key as string,Attributes[key] as string); } } if(Value!=null) { writer.WriteString(Value); } else { if(Elements!=null) { foreach(object item in Elements) { BaseSerializeElement inner=(BaseSerializeElement)item; inner.WriteXml(writer); } } } writer.WriteEndElement(); } // // public System.Xml.Schema.XmlSchema GetSchema() // { // // TODO: 添加 AnyElement.GetSchema 实现 // return null; // } public void ReadXml(XmlReader reader) { ReadXml(reader,false); } private void ReadRoot(XmlReader reader) { while(reader.Read()) { if(reader.EOF) return; switch(reader.NodeType) { case XmlNodeType.XmlDeclaration: this._isroot=true; this._declaration=reader.Value; break; // case XmlNodeType.Comment: // AddComment(reader.Value); // break; case XmlNodeType.DocumentType: this._documenttype=reader.Value; break; case XmlNodeType.Element: return; default: break; } } } // public void AddComment(string comment) // { // _comments.Add(comment); // } public void ReadXml(System.Xml.XmlReader reader,bool isroot) { if(reader.NodeType==XmlNodeType.None||isroot) { ReadRoot(reader); } if(reader.EOF||reader.NodeType!=XmlNodeType.Element) return; this._tag=reader.LocalName; this._prefix=reader.Prefix; this._namespaceuri=reader.NamespaceURI; this._xmllang=reader.XmlLang; //this._xmlspace=reader.XmlSpace; this._baseuri=reader.BaseURI; //this._nametable=reader.NameTable; int depth=reader.Depth; bool isempty=reader.IsEmptyElement; if(reader.HasAttributes) { int n=reader.AttributeCount; for(int i=0;i<n;i++) { reader.MoveToAttribute(i); AddAttribute(reader.Name,reader.Value); } } if(isempty) return; //读取所有内部xml元素 while(reader.Read()) { switch(reader.NodeType) { case XmlNodeType.EndElement: if((reader.Depth==depth)&&(reader.Name==TAG)) return; break; case XmlNodeType.Element: if(reader.Depth==depth+1) AddElement(new BaseSerializeElement(reader)); break; case XmlNodeType.Text: if(reader.Depth==depth+1) _value=reader.Value; break; case XmlNodeType.CDATA: if(reader.Depth==depth+1) _cdata=reader.Value; break; } } } #endregion private void print(string format,params object[] args) { Console.WriteLine(format,args); } } } tester ---------------------- using System; using System.IO; using System.Xml; using LocalPostBB.Framework.Common; namespace LocalPostBB { /// <summary> /// Class1 的摘要说明。 /// </summary> class Tester { /// <summary> /// 应用程序的主入口点。 /// </summary> [STAThread] static void Main(string[] args) { Tester tester=new Tester(); tester.TestSerialize(); Console.ReadLine(); } public void TestSerialize() { BaseSerializeElement t=null; string filename=@"E:\Program Files\Altova\XMLSpy2005\Examples\OrgChartDebug.xslt"; XmlTextReader reader=new XmlTextReader(filename); t=new BaseSerializeElement(reader,true); reader.Close(); StringWriter wr=new StringWriter(); XmlTextWriter writer=new XmlTextWriter(wr); writer.Formatting=Formatting.Indented; t.WirteXmlRoot(writer); Console.WriteLine(wr.ToString()); writer.Close(); Console.WriteLine("successful!"); } } } ------------------ 初步代码 只对xml文件进行了简单的读写功能 
|