本次制作综合信息网在图库德操作中,主要运用了Ajax、XML与XSLT综合使用
一、在服务器端进行XSLT的转换
private void SteamOperateXSLT(DataSet myData,String XSLTFileName) { XslCompiledTransform xslDoc = new XslCompiledTransform(); xslDoc.Load(Server.MapPath("XSLT/" + XSLTFileName)); MemoryStream ms = new MemoryStream(); XmlWriter xw = XmlWriter.Create(ms, xslDoc.OutputSettings); XmlDataDocument xml = new XmlDataDocument(myData); xml.Save(xw); ms.Seek(0, SeekOrigin.Begin);//指针归位 XmlReader xr = XmlReader.Create(ms); xslDoc.Transform(xr, null, Response.Output); xw.Close(); xr.Close(); ms.Close(); ms.Dispose(); }
在这个函数中主要的功能就是通过DATASET产生一个XML文档对象,将其存在内存流中然后进行XSLT的转化直接输出到Response流中,
为了不生成物理的XML文档,这里采用MemoryStream、XmlWriter、XmlReader搭配使用产生这个效果。这里要注意的是”ms.Seek(0, SeekOrigin.Begin)“:当使用xml.Save()这个方法将xml文档对象的内容写入内存流的过程中,流中的指针随写入结束一直知道流最后一个位置,在用XmlReader从内存流中读取内容之前,必须将流指针归位。否则会因为指针在最后位置而无法读出任何内容(就这个问题差点雷死我。。。)
二、DATASET与XML的转换
在制作DATASET转化成XML文档的时候,发现使用XmlDataDocument xml = new XmlDataDocument(myData)、还是DATASET.WriteXML()或其他方法转换,都发现在数据集中当某个字段为空的时候,转换后的XML文档中都没有对应的元素。由于目前没有找到解决的方法,我暂时用自己写的一个方法来生成xml文档。
public XmlDocument CreateXMLFile(DataSet ds) { //建立文档模型 XmlDocument document = new XmlDocument(); string xmlString = "<?xml version=/"1.0/" encoding=/"gb2312/"?><NewDataSet></NewDataSet>"; document.LoadXml(xmlString); for (int i = 0; i < ds.Tables[0].Rows.Count; i++) { XmlElement table = document.CreateElement(ds.Tables[0].TableName); for (int j = 0; j < ds.Tables[0].Columns.Count; j++) { XmlElement x = document.CreateElement(ds.Tables[0].Columns[j].ColumnName); x.InnerText = ds.Tables[0].Rows[i][j].ToString(); table.AppendChild(x); } document.FirstChild.NextSibling.AppendChild(table); } return document; }
三、由于使用Ajax所以存在跨浏览器的问题一下本次不同浏览器对xml文档操作的差异
IE:
var items = xmlDoc.selectNodes("//NewDataSet/item/JTZK");//取得一个节点元素
items[i].text;//取得节点的内容
Mozila:
var items = xmlDoc.getElementsByTagName("JTZK");
items[i].firstChild.textContent;//取得节点的内容