导 读:介绍了有关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();
} 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("
"); }
// 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("
"); }
// ********************************** 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(' '); }
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("
"); }
/// ************************* 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(" " + "<" + 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("
"); } } }
下面就是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>
|