XmlTransform 对xml中的特定名称空间的元素进行填充

原创 2005年04月23日 00:39:00

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

Oracle PLSQL 几种游标的用法

1。 PL/SQL里的游标可以分为显式和隐式两种,而隐式有分为select into隐式游标和for .. in 隐式游标两种。所以,我们可以认为,有3种游标用法: A. 显式游标 普通显式游标 代...

Oracle之DML和DDL语句

Oracle常用语句 1、delete语句 删除记录。 SQL>DELETE FROM [WHERE ] 注意: 2、truncate语句 删除表中所有数据,但不会删除表结构,dro...

jquery解析带名称空间的xml

  • 2012年11月12日 16:59
  • 13KB
  • 下载

xStream完美转换XML、JSON xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换; 前面有介

xStream完美转换XML、JSON xStream框架 xStream可以轻易的将Java对象和xml文档相互转换,而且可以修改某个特定的属性和节点名称,而且也支持json的转换; 前面...

Redis实战系列(6) 利用lua对redis特定类型元素的list进行分段

只对排序的数字list进行分段存取,性能上有所下降,但是没有测试下降多少 list_add.lua local config = redis.call('config','get','li...

[工作笔记] Dom4j 和 XPath 结合 选取 xml 中任意深度的(即所有的)特定元素

第一次写技术相关的文章,技术含量不高,而且肯定会有诸多不足,欢迎大家提出意见,批评指正。 本文主要包含三部分: 为什么要写这篇工作笔记?怎样解决的此问题?总结 1 为什么要写这篇工作...

Schema和xml名称空间理解笔记

xml命名空间

XML名称空间小结

一、xml名称空间 xml 文档可以包含许多标签以及属性,为了区分在不同文档中的相同标签,需要使用xml名称空间这个概念,就像java中相同名称的类,需要放在不同的包中一样。通过给元素或者属性加上名...

document.getElementsByClassName:简单的原生通过className查找元素,可指定多个样式名称进行查找

//仅为使用习惯保留document.getElementsByClassName()调用方式,无法使用链式访问 HTMLDocument.prototype.getElementsByClassN...

dom4j和xpath解析带名称空间的xml…

首先以spring的配置文件applicationContext.xml为例:    package cn.itcast.dom4j; import java.io.File; import ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:XmlTransform 对xml中的特定名称空间的元素进行填充
举报原因:
原因补充:

(最多只允许输入30个字)