using System;
using System.Xml;
namespace xmltest
{
///
1<summary>
2/// XmlTransoform 的摘要说明。
3/// </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
1<count;i++) <summary="" \-------------------------------------------------="" else="" if(isempty)="" namespace="" reader.movetoattribute(i);="" reader.read();="" return="" sw.tostring();="" system.xml;="" system;="" using="" writer.writeattributestring(reader.name,reader.value);="" writer.writeendelement();="" writer.writenode(reader,true);="" xmltest="" {="" }="">
2/// SimpleTagControl 的摘要说明。
3///
4public class SimpleTagControl: ITagControl
5{
6
7public SimpleTagControl()
8{
9
10}
11
12#region ITagControl 成员
13
14public string Render()
15{
16
17if(members==null||members.Count==0)
18return innerXml;
19else
20{
21System.IO.StringWriter w=new System.IO.StringWriter();
22XmlTextWriter xw=new XmlTextWriter(w);
23foreach(object key in members.Keys)
24{
25xw.WriteStartElement(key.ToString());
26xw.WriteString(members[key].ToString());
27xw.WriteEndElement();
28}
29return w.ToString();
30}
31}
32protected string innerXml;
33public string InnerXml
34{
35get
36{
37return innerXml;
38}
39}
40
41#endregion
42
43/// <input/>innerXml
44public SimpleTagControl(string innerXml)
45{
46init(innerXml);
47}
48private System.Collections.SortedList members;
49private void createMember(string key,string value)
50{
51if(members==null)
52{
53members=new System.Collections.SortedList();
54}
55if(members.ContainsKey(key))
56{
57members.Add(key,value);
58}
59else
60{
61members[key]=value;
62}
63}
64
65private void init(string innerXml)
66{
67this.innerXml=innerXml;
68if(innerXml.StartsWith("<"))
69{
70System.IO.StringReader sr = new System.IO.StringReader(innerXml);
71XmlTextReader reader = new XmlTextReader(sr);
72while(reader.Read())
73{
74if(reader.NodeType==XmlNodeType.Text)
75{
76return;
77}
78if(reader.NodeType==XmlNodeType.Element)
79{
80createMember(reader.LocalName,reader.ReadInnerXml());
81}
82}
83}
84}
85}
86}
87\--------------------------------
88
89[STAThread]
90static void Main(string[] args)
91{
92Class1 c1=new Class1();
93c1.transform();
94Console.ReadLine(); }
95public void transform()
96{
97string xml="<a "="" \="" ddd="" http:="" key='\"keyname\"' xmlns:b="ss" xmlns:bb='\"'><bb:b a="c"><a>aaa</a></bb:b><a as="sdf"></a><b:c key='\"dd\"'><b \"="" ddd1="" http:="" xmlns='\"'><bb:h>hhh</bb:h></b></b:c><d>d1d1d1</d><e>eee</e></a>";
98XmlTransform st=new XmlTransform();
99Console.WriteLine(st.Transform(xml,@" http://ddd/ "));
100}
101
102\-----------------------------------------------------
103
104欢迎就此问题进行评论,初步代码有待改进...
105
106\--fallseir.li 2005.4.23 0:36</count;i++)>