using System; using System.Xml; namespace xmltest { /// <summary> /// XmlTransoform 的摘要说明。 /// </summary> public class XmlTransform { public XmlTransform() { } public ITagControl CreateControl(string nsuri,string tag,string innerxml) { return new SimpleTagControl(innerxml); } public string Transform(string xml,string nsuri) { System.IO.StringReader sr = new System.IO.StringReader(xml); XmlTextReader reader = new XmlTextReader(sr); System.IO.StringWriter sw = new System.IO.StringWriter(); XmlTextWriter writer = new XmlTextWriter(sw); writer.Formatting=System.Xml.Formatting.Indented; reader.Read(); while(!reader.EOF) { if(reader.NodeType==XmlNodeType.Element&&reader.NamespaceURI==nsuri) { string localname=reader.LocalName; ITagControl tc=CreateControl(nsuri,reader.LocalName,reader.ReadInnerXml()); writer.WriteRaw(tc.Render()); // reader.Read(); reader.ReadInnerXml 已经进行的一次read } else { if(reader.NodeType==XmlNodeType.Element) { bool isEmpty=false; if(reader.IsEmptyElement) { isEmpty=true; } writer.WriteStartElement(reader.Name); int count = reader.AttributeCount; for(int i=0;i<count;i++) { reader.MoveToAttribute(i); writer.WriteAttributeString(reader.Name,reader.Value); } if(isEmpty) { writer.WriteEndElement(); } reader.Read(); } else { writer.WriteNode(reader,true); } } } return sw.ToString(); } } } ------------------------------------------------- using System; using System.Xml; namespace xmltest { /// <summary> /// SimpleTagControl 的摘要说明。 /// </summary> public class SimpleTagControl: ITagControl { public SimpleTagControl() { } #region ITagControl 成员 public string Render() { if(members==null||members.Count==0) return innerXml; else { System.IO.StringWriter w=new System.IO.StringWriter(); XmlTextWriter xw=new XmlTextWriter(w); foreach(object key in members.Keys) { xw.WriteStartElement(key.ToString()); xw.WriteString(members[key].ToString()); xw.WriteEndElement(); } return w.ToString(); } } protected string innerXml; public string InnerXml { get { return innerXml; } } #endregion /// <input>innerXml</input> public SimpleTagControl(string innerXml) { init(innerXml); } private System.Collections.SortedList members; private void createMember(string key,string value) { if(members==null) { members=new System.Collections.SortedList(); } if(members.ContainsKey(key)) { members.Add(key,value); } else { members[key]=value; } } private void init(string innerXml) { this.innerXml=innerXml; if(innerXml.StartsWith("<")) { System.IO.StringReader sr = new System.IO.StringReader(innerXml); XmlTextReader reader = new XmlTextReader(sr); while(reader.Read()) { if(reader.NodeType==XmlNodeType.Text) { return; } if(reader.NodeType==XmlNodeType.Element) { createMember(reader.LocalName,reader.ReadInnerXml()); } } } } } } -------------------------------- [STAThread] static void Main(string[] args) { Class1 c1=new Class1(); c1.transform(); Console.ReadLine(); } public void transform() { string xml="<a xmlns:bb=\"http://ddd/\" xmlns:b='ss' key=\"keyname\"><bb:b a='c'><a>aaa</a></bb:b><a as='sdf'/><b:c key=\"dd\"><b xmlns=\"http://ddd1/\"><bb:h>hhh</bb:h></b></b:c><d>d1d1d1</d><e>eee</e></a>"; XmlTransform st=new XmlTransform(); Console.WriteLine(st.Transform(xml,@"http://ddd/")); } ----------------------------------------------------- 欢迎就此问题进行评论,初步代码有待改进... --fallseir.li 2005.4.23 0:36 
|