
 
 | 
| 技术资料  > .Net专区 > Asp.Net开发 : 开心就贴(四) |  
开心就贴(四) March 25,2004 |  
呵呵,有意思,听过一个笑话,说德国一个老头,是个聋子,在如厕时,突然苏联战机空袭,虽然房屋倒塌,可是全家人都没有事情,家里人扒开卫生间的墙壁,发现老头在那儿乐,说:我一拉抽水马桶的绳,屋就倒了。 
哈哈哈,我也是这样,刚才我一发这贴子,chinaasp就完了,还以为是我的事情呢,原来是苏联飞机来炸了,呵呵。 
如果你喜欢玩xml,那么请跟我来,但在此之前,请深呼一口气,因为我给大家介绍一个长代码,在这个代码中揭示了微软在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(); 
 
            } 
            catch (Exception exp) { 
                //outputQ.Append("</xmp><font color="#FF6600">"+ exp.Message+"</font><xmp>"); 
            } 
            finally {} 
        } 
        else if (FileLabel.Text != String.Empty) 
        { 
            try 
            { 
                MyXml.Document.Load(FileLabel.Text); 
                outputXml = new StringBuilder(); 
                XmlTextReader reader = new XmlTextReader (FileLabel.Text); 
                ShowDocument(); 
                TextBox3.Text = outputXml.ToString(); 
 
                ShowDocument(); 
 
                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(); 
 
            } 
            catch (Exception exp) { 
                outputQ.Append("</xmp><font color="#FF6600">"+ exp.Message+"</font><xmp>"); 
            } 
            finally {} 
        } 
    } 
 
    private void XPathQuery(XmlNavigator navigator, String xpathexpr ) 
    { 
        try 
        { 
            // Save context node position 
            navigator.PushPosition(); 
            navigator.Select (xpathexpr); 
            FormatXml(navigator); 
 
            // Restore context node position 
            navigator.PopPosition();         
        } 
        catch (Exception e) 
        { 
        } 
    } 
     
//***************************** 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("rn"); 
    } 
 
    // 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("rn"); 
    } 
 
// ********************************** 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'); 
        } 
 
        outputXml.Append(reader.Prefix + NodeType + "<" + reader.Name + ">" + reader.Value); 
 
        // Display the attributes values for the current node 
        if (reader.HasAttributes) 
        { 
            outputXml.Append(" Attributes:"); 
 
            for (int j=0; j < reader.AttributeCount; j++) 
            { 
                outputXml.Append(reader[j]); 
            } 
        } 
        outputXml.Append("rn"); 
    } 
 
    /// ************************* DOM ********************************* 
    protected void ShowDocument(XmlNode node) 
    { 
        if (node != null) 
            Format (node); 
 
        if (node.HasChildNodes) 
        { 
            node = node.FirstChild; 
            while (node != null) 
            { 
                ShowDocument(node); 
                node = node.NextSibling; 
            } 
        } 
    } 
 
    // Format the output 
    private void Format (XmlNode node) 
    { 
        if (!node.HasChildNodes) 
        { 
           outputXml.Append("t" + "<" + node.Value + ">"); 
        } 
 
        else 
        { 
            outputXml.Append("<" + node.Name + ">"); 
            if (XmlNodeType.Element == node.NodeType) 
            { 
                XmlNamedNodeMap map = node.Attributes; 
                foreach (XmlNode attrnode in map) 
                    outputXml.Append(" " + attrnode.Name + "<" + attrnode.Value + "> "); 
            } 
            outputXml.Append("rn"); 
        } 
    } 
} 
 
 
下面就是webform2.aspx了 
webform2.aspx 
----------------------------------- 
<%@ Import Namespace="System" %> 
<%@ Import Namespace="System.IO" %> 
<%@ Assembly Name="System.Xml" %> 
<%@ Import Namespace="System.Xml" %> 
<%@ Page Language="C#" Inherits="WebForm2" Src="WebForm2.cs" Debug="true" %> 
 
<HTML><HEAD> 
 
  <script runat="server" language="C#"> 
    // Put page script here 
        public void On_KeyUp(object sender, System.EventArgs e) 
    { 
        Response.Write("Works"); 
    } 
 
  </script> 
 
<!--<link REL="STYLESHEET" HREF="default.css" TYPE="text/css">--> 
<TITLE>test</TITLE> 
</HEAD> 
 
<BODY   > 
 
     
<form method="post" action="WebForm2.aspx" runat="server" enctype="multipart/form-data"> 
   
<div align="left"> 
<table> 
  <tr> 
    <td>XML Document:</td> 
    <td><input type=file id="XmlFile" runat=server>         FileName:</td> 
    <td><asp:label id="FileLabel" runat="server"></asp:label></td> 
  </tr> 
 
  <tr> 
    <td>XPath Expression</td> 
    <td><asp:textbox id=TextBox1 runat="server" Height="20" Width="300" text=".//text()" OnKey_Up="On_KeyUp"></asp:textbox></td> 
    <td><asp:button type=submit OnClick="Query_Click" runat="server" Height="20" Width="91" text="Query"></asp:button></td> 
  </tr> 
</table> 
 
</br> 
<table> 
  <tr><td>Output from Query</td><td>XML Data</td><tr> 
  <tr><td>Query Display: <asp:dropdownlist runat="server"> 
                         <asp:listitem>Descriptive</asp:listitem> 
                         <asp:listitem>XML</asp:listitem> 
                         </asp:dropdownlist> 
  </td><tr> 
  <tr> 
    <td width="50%" valign="top" align="left"><asp:textbox id=TextBox2 runat="server" Height="400" Width="350" TextMode="MultiLine" Rows="10"></asp:textbox></td> 
    <td width="50%" valign="top" align="left"><asp:xml id="MyXml" transformsource="test.xsl" runat=server/></asp:xml></td> 
  </tr> 
</table> 
</div> 
 
    <td><asp:textbox id=TextBox3 runat="server" Height="1" Width="5" TextMode="MultiLine" Rows="110"></asp:textbox></td> 
 
</form> 
     
</BODY> 
</HTML> 
         
         |  
 
 | 
  
Copyright © 2001-2008 Shenzhen Hiblue Software Team All rights reserved