導 讀:介紹了有關asp.net中xml控件的使用,有個小BUG:在WEBFORM.ASPX中出現的XML控件,其中的transformsource屬性設定了樣式表文件路徑,可是在文章出處沒有找到這個XSL文件.:( 自己解決吧. 在這個代碼中揭示了微軟在ASP.NET架構中隱藏的一個WEB表單控件,即<asp:xml runat=server/>,我只給代碼,不給解釋,大家自己下課后去研究吧。 另外,由于是beta1,在這個控件中你使用的xslt里面不能使用<xsl:sort>,當然,亦不能使用那個order-by了,因為它支持的xsl空間是帶"1999"的那個,而不是原來的那個。 另外,我從微軟得到的回答就是在beta2里面,它將支持<xsl:sort>,就可以全部轉向xml+xsl了,而不用再為源代碼保密問題頭疼了。 請看下例: webform2.cs - using System; using System.Collections; using System.ComponentModel; using System.Data; using System.Drawing; using System.Web; using System.Web.sessionState; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.HtmlControls; using System.Text; using System.IO; using System.Xml;
public class WebForm2 : Page { public StringBuilder outputQ; public StringBuilder outputXml; public DocumentNavigator nav = null; public HtmlInputFile XmlFile;
public System.Web.UI.WebControls.Xml MyXml;
public System.Web.UI.WebControls.TextBox TextBox1; public System.Web.UI.WebControls.TextBox TextBox2; public System.Web.UI.WebControls.TextBox TextBox3; public System.Web.UI.WebControls.Button Query; public System.Web.UI.WebControls.Label FileLabel;
public void On_KeyUp(object sender, System.EventArgs e) { Response.Write("Works"); }
PRotected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) { // // Evals true first time browser hits the page // } }
public void Query_Click(object sender, System.EventArgs e) { HttpPostedFile xmlfile = XmlFile.PostedFile; XmlDocument doc = new XmlDocument(); MyXml.Document = new XmlDocument(); // TextBox2.Text=""; // TextBox3.Text="";
if (xmlfile.FileName != String.Empty) { try { FileLabel.Text= xmlfile.FileName;
MyXml.Document.Load(xmlfile.FileName); outputXml = new StringBuilder(); XmlTextReader reader = new XmlTextReader (xmlfile.FileName); ShowDocument(); TextBox3.Text = outputXml.ToString();
outputQ = new StringBuilder(); doc.Load(xmlfile.FileName); DocumentNavigator nav = new DocumentNavigator(doc); // Perform the query e.g. "descendant::book/price" XPathQuery(nav, TextBox1.Text); TextBox2.Text = outputQ.ToString();
outputQ = new StringBuilder(); doc.Load(FileLabel.Text); DocumentNavigator nav = new DocumentNavigator(doc); // Perform the query e.g. "descendant::book/price" XPathQuery(nav, TextBox1.Text); TextBox2.Text = outputQ.ToString();
//***************************** Navigator ************************************ private void FormatXml (XmlNavigator navigator) { while (navigator.MoveToNextSelected()) { switch (navigator.NodeType) { case XmlNodeType.ProcessingInstruction: Format (navigator, "ProcessingInstruction"); break; case XmlNodeType.DocumentType: Format (navigator, "DocumentType"); break; case XmlNodeType.Document: Format (navigator, "Document"); break; case XmlNodeType.Comment: Format (navigator, "Comment"); break; case XmlNodeType.Element: Format (navigator, "Element"); break; case XmlNodeType.Text: Format (navigator, "Text"); break; case XmlNodeType.Whitespace: Format (navigator, "Whitespace"); break; } } outputQ.Append("/r/n"); }
// Format the output private void Format (XmlNavigator navigator, String NodeType) { String value = String.Empty; String name = String.Empty;
if (navigator.HasChildren) { name = navigator.Name; navigator.MoveToFirstChild(); if (navigator.HasValue) { value = navigator.Value; } } else { if (navigator.HasValue) { value = navigator.Value; name = navigator.Name; } } outputQ.Append(NodeType + "<" + name + ">" + value); outputQ.Append("/r/n"); }
// ********************************** XmlReader ***************************** public void ShowDocument () { outputXml = new StringBuilder(); XmlTextReader reader = new XmlTextReader (FileLabel.Text);
while (reader.Read()) { switch (reader.NodeType) { case XmlNodeType.ProcessingInstruction: Format (reader, "ProcessingInstruction"); break; case XmlNodeType.DocumentType: Format (reader, "DocumentType"); break; case XmlNodeType.Comment: Format (reader, "Comment"); break; case XmlNodeType.Element: Format (reader, "Element"); break; case XmlNodeType.Text: Format (reader, "Text"); break; case XmlNodeType.Whitespace: break; } } TextBox3.Text = outputXml.ToString(); }
protected void Format(XmlReader reader, String NodeType) { // Format the output for (int i=0; i < reader.Depth; i++) { outputXml.Append('/t'); }