[CFM] xml op de server laten parsen naar html

Pagina: 1
Acties:

  • stean
  • Registratie: November 2000
  • Laatst online: 18-08 22:30
in asp kan je xml op de server laten parsen door dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
dim sXMLFilename
dim sXSLFilename
sXMLFilename = "testxml.xml"
sXSLFilename = "test.xsl"

TransformXML sXMLFilename, sXSLFilename

Sub TransformXML(sXMLFilename, sXSLFilename)
  dim objXMLDoc
  dim objXSLDoc
  'First, load the XML Document
  set objXMLDoc = Server.CreateObject("Microsoft.XMLDOM")
  objXMLDoc.async = false
  objXMLDoc.load(Server.MapPath(sXMLFilename))
  'Now Load the XSL Document
  set objXSLDoc = Server.CreateObject("Microsoft.XMLDOM")
  objXSLDoc.async = false
  objXSLDoc.load(Server.MapPath(sXSLFilename))

  Response.Write(objXMLDoc.transformNode(objXSLDoc))
End sub

maar hoe of wat spreek ik dit object met cold fusion aan?
ik zit wat te pielen met het <cfobject>
code:
1
2
3
4
5
6
<cffile action="write" nameconflict="overwrite" file="C:\Floriade\01 dev\update\testxml.xml" output="#tempxml#">
            
<cfobject action="create" type="COM" class="Microsoft.XMLDOM" name="Parser">
                <cfset xmlFile ="testxml.xml">
                <cfset Parser.Async = false>
                <cfset Parser.Load(xmlFile)>

maar verder kom ik niet.andere mensen????

Verwijderd

Een voorbeeld
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<CFSETTING showdebugoutput="NO">
<html>
<head>
     <title>Example: Build XML from query then read xml back into a table.</title>
     <!--- Author: Micha Schopman, Team Allaire Member--->
</head>
<CFSILENT>
        <!---  This example works with the ColdFusion example database called "cfsnippets"--->
        <CFQUERY NAME="qGetMessages" DATASOURCE="cfsnippets">
        SELECT  Message_ID, Thread_ID, UserName, Subject, Posted, Body
        FROM       Messages
        </CFQUERY>
        
        <!--- create the COM object --->
        <CFOBJECT action="CREATE" type="COM" class="Microsoft.XMLDOM" name="objXML">
        
           <!--- create the root element --->
           <CFSET root = objXML.createElement("MessageItem")>
           <CFSET root = objXML.appendChild(root)>
           
           <!--- create the doctype and insert before the root element --->
           <CFSET XMLVersion = objXML.CreateProcessingInstruction("xml", "version='1.0'")>
           <CFSET objXML.insertBefore(XMLVersion, root)>
        
           <CFOUTPUT query="qGetMessages">
                    
                    <CFSCRIPT>      
                            // create the node Message
                            newMess=objXML.createElement("Message");
                            root.appendChild(newMess);
                            
                            // create the node Message_ID
                            newMID=objXML.createElement("Message_ID");
                            newMIDText=objXML.createTextNode("#Message_ID#");
                            newMID.appendChild(newMIDText);
                            newMess.appendChild(newMID); 
                            
                            // create the node Thread_ID
                            newTID=objXML.createElement("Thread_ID");
                            newTIDText=objXML.createTextNode("#Thread_ID#");
                            newTID.appendChild(newTIDText);
                            newMess.appendChild(newTID);
                            
                            // create the node UserName
                            newUN=objXML.createElement("UserName");
                            newUNText=objXML.createTextNode("#UserName#");
                            newUN.appendChild(newUNText);
                            newMess.appendChild(newUN);
                            
                            // create the node Subject
                            newSUB=objXML.createElement("Subject");
                            newSUBText=objXML.createTextNode("#Subject#");
                            newSUB.appendChild(newSUBText);
                            newMess.appendChild(newSUB);
                            
                            // create the node Posted
                            newPOS=objXML.createElement("Posted");
                            newPOSText=objXML.createTextNode("#Posted#");
                            newPOS.appendChild(newPOSText);
                            newMess.appendChild(newPOS);
                            
                            // create the node Body
                            newBOD=objXML.createElement("Body");
                            newBODText=objXML.createTextNode("#Body#");
                            newBOD.appendChild(newBODText);
                            newMess.appendChild(newBOD);
                    </CFSCRIPT>
                    
              </CFOUTPUT> 
              
        
        <CFSET currentDir = LCase(GetDirectoryFromPath(getcurrentTemplatePath()))>
        <CFSET XMLOutputFile = currentDir & "qMessages.xml">
        <CFSET objXML.Save(XMLOutputFile)>
        
</CFSILENT>

<body>
     <cfoutput>
        <font size="4" face="Arial">Example: Build <A HREF="qMessages.xml">XML</A> from query then read xml back into a table.</font> 
           </cfoutput>
     <P>
<!--- Read the previous output file path into a new input variable --->
<CFSET XMLInputFile = XMLOutputFile>

<!--- Load XML Document into MS XML DOM --->
<CFSET objXML.LOAD(XMLInputFile)>

<CFSET MessList = objXML.getElementsByTagName("Message")>
        <!--- try to quietly drop any earlier version of the new table --->
        <CFTRY>     
              <CFQUERY name="maketable" datasource="cfsnippets">
                 Drop Table MessagesFromXML
              </CFQUERY>
        <CFCATCH type="Any"></CFCATCH>
        </CFTRY>
        
        <!--- make table to insert xml data --->
        <CFTRY>     
              <CFQUERY name="maketable" datasource="cfsnippets">
              CREATE TABLE MessagesFromXML (
                 mykey number,
                 Message_ID number, 
                 Thread_ID  text, 
                 Username text,
                 Subject text,
                 Posted text,
                 Body text)
              </CFQUERY>
        <CFCATCH type="Any"></CFCATCH>
        </CFTRY>
        
        <CFTRY>
        <CFSILENT>
        <CFSET i = 1>
         <CFLOOP COLLECTION="#MessList#" Item="Message">
               <CFSET xMessage_ID = Message.SelectSingleNode("Message_ID")> 
                <CFSET xThread_ID = Message.SelectSingleNode("Thread_ID")>
                <CFSET xUsername = Message.SelectSingleNode("UserName")>
                <CFSET xSubject = Message.SelectSingleNode("Subject")>
                <CFSET xPosted = Message.SelectSingleNode("Posted")>
                <CFSET xBody = Message.SelectSingleNode("Body")>
                
                <!--- insert data row by row --->
              <cfoutput>            
                 <CFQUERY name="insertXMLdata" datasource="cfsnippets">
                    Insert Into MessagesFromXML(mykey, Message_ID, Thread_ID, Username, Subject, Posted, Body)
                    values(#i#, #xMessage_ID.Text#, #xThread_ID.Text#, '#xUsername.Text#', '#xSubject.Text#', '#xPosted.Text#', '#xBody.Text#')
                 </CFQUERY>
              </cfoutput>
              <CFSET i = i + 1>
         </CFLOOP>
         </CFSILENT>
           
         <!--- find out how many rows were inserted --->
         <CFQUERY name="getmaxrow" datasource="cfsnippets">
              Select Max(mykey) As maxrownum From MessagesFromXML  
           </CFQUERY> 
        
     <CFCATCH type="Any"><CFOUTPUT>#cfcatch.message#<BR>#cfcatch.detail#</CFOUTPUT></CFCATCH>
    </CFTRY>
<CFOUTPUT query="getmaxrow"><h3>Successfully inserted <font color="FF0000">#Round(maxrownum)#</font> rows into the new cfsnippets table MessagesFromXML!</h3></CFOUTPUT> 

<!--- now build a table to display the XML content --->
<TABLE BORDER="1" bgcolor="eeeeee" width="100%">
   <TR>
         <TD><strong>Message ID</strong></TD>
        <TD><strong>Thread ID</strong></TD>
         <TD><strong>Username</strong></TD>
        <TD><strong>Subject</strong></TD>
        <TD><strong>Posted</strong></TD>
        <TD><strong>Body</strong></TD>
   </TR>
   <!--- Loop through the collection --->
   <CFLOOP COLLECTION="#MessList#" Item="Message">
         <CFSET xMessage_ID = Message.SelectSingleNode("Message_ID")> 
        <CFSET xThread_ID = Message.SelectSingleNode("Thread_ID")>
        <CFSET xUsername = Message.SelectSingleNode("UserName")>
        <CFSET xSubject = Message.SelectSingleNode("Subject")>
        <CFSET xPosted = Message.SelectSingleNode("Posted")>
        <CFSET xBody = Message.SelectSingleNode("Body")>
        <CFOUTPUT>
          <TR>
                <TD><font size="2" face="Arial">#xMessage_ID.Text#</font></TD> 
             <TD><font size="2" face="Arial">#xThread_ID.Text#</font></TD>
              <TD><font size="2" face="Arial">#xUsername.Text#</font></TD>
              <TD><font size="2" face="Arial">#xSubject.Text#</font></TD>
              <TD><font size="2" face="Arial">#xPosted.Text#</font></TD>
              <TD><font size="2" face="Arial">#xBody.Text#</font></TD>  
          </TR>
         </CFOUTPUT>
   </CFLOOP>
</TABLE>  
</body>
</html>

Verwijderd

En een voorbeeld met gebruik van het Slashdot document ;)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">

<html>
<head>
     <title>Untitled</title>
</head>

<body>

<CFHTTP method="GET" url="http://slashdot.org/slashdot.xml" path="C:\TEMP" file="slashdot.xml" timeout="30" >

<cfobject action="CREATE" type="COM" class="Microsoft.XMLDOM" name="objXMLDOM">

<cfset XMLInputFile = "C:\TEMP\slashdot.xml">

<CFSET objXMLDOM.LOAD(XMLInputFile)>

<CFSET colBookList = objXMLDOM.getElementsByTagName("story")>
<TABLE BORDER="1" bgcolor="dddddd" width="100%">
   <TR>
         <TD><strong>Title</strong></TD>
        <TD><strong>Time</strong></TD>
         <TD><strong>Author</strong></TD>
        <TD><strong>Department</strong></TD>
        <TD><strong>Topic</strong></TD>
   </TR>
   <!--- Loop through the collection --->
   <CFLOOP COLLECTION="#colBookList#" Item="story">
      
         <CFSET Slash_Title = story.SelectSingleNode("title")> 
        <CFSET Slash_Time = story.SelectSingleNode("time")>
        <CFSET Slash_Author = story.SelectSingleNode("author")>
        <CFSET Slash_Department = story.SelectSingleNode("department ")>
        <CFSET Slash_Topic = story.SelectSingleNode("topic")>
         <CFSET Slash_Url = story.SelectSingleNode("url")>
        
         <CFOUTPUT>
          <TR>
               <TD><font size="2" face="Arial"><strong><A HREF="#Slash_Url.Text#">#Slash_Title.Text#</A></strong></font></TD>
             <TD><font size="2" face="Arial">#Slash_Time.Text#</font></TD>
              <TD><font size="2" face="Arial">#Slash_Author.Text#</font></TD>
              <TD><font size="2" face="Arial">#Slash_Department.Text#</font></TD>
              <TD><font size="2" face="Arial">#Slash_Topic.Text#</font></TD>
          </TR>
         </CFOUTPUT>
        
   </CFLOOP>
</TABLE>
<!---check if an error exists--->
<cfset XMLErr = objXMLDOM.parseError>
<cfoutput>
     <cfif XMLErr.errorcode NEQ 0>--
        ErrorCode:  #XMLErr.errorcode#<br>
        ErrorReason: #XMLErr.reason#
     </cfif>
</cfoutput>

</body>
</html>

  • stean
  • Registratie: November 2000
  • Laatst online: 18-08 22:30
bedankt gordijnstok hier kan ik weer mee puzzelen.
maar nog 1 vraagje dan.

ik heb al een xml document en ik heb ook al een stylesheet

kan ik bij dat tweede voorbeeld ipv de nodes te selecteren het ook zo gebruiken dat die meteen mijn stylesheet pakt?
dus zoiets:
code:
1
2
3
4
5
6
7
8
<cfobject action="create" type="COM" class="Microsoft.XMLDOM" name="Parser">
                <cfset xmlFile ="testxml.xml">
                <cfset Parser.Async = false>
                <cfset Parser.Load(xmlFile)>
            <cfobject action="create" type="COM" class="Microsoft.XMLDOM" name="Parser">
                <cfset xmlFile2 ="naarhtml.xsl">
                <cfset Parser.Async = false>
                <cfset Parser.Load(xmlFile2)>

de source van mijn xml is dan dit (en daar zitten meerdere keren de zelfde waarden in.:
code:
1
2
3
4
5
6
7
8
9
10
11
12
<?xml version='1.0'?>
<ARTICLE>
<H1 ID="q1"><TITLE>aaaa</TITLE>
<P>zzzzz</P>
<H2 ID="w1"><TITLE>vvvv</TITLE>
<P>zzzzz</P>
</H2><H2 ID="w2"><TITLE>vvvv</TITLE>
<OL>
<LI>zzzzz</LI>
<LI>xxxx</LI>
<LI>xxx</LI></OL>
<P> </P></H2></H1></ARTICLE>

(gaat om html naar xml om te zetten en later weer naar html)

Verwijderd

Je bedoelt eigenlijk dat je serverside XSL wilt gebruiken? Das een hele goeie..

edit:

Ik heb het eventjes uitgeprobeerd en dit werkt bij mij perfect. :) Ik draai het overigens op ColdFusion Server 5 Enterprise
[code]<CFOBJECT action="create" type="COM" class="Microsoft.XMLDOM" name="DataBestand">
<CFSET DataBestand.Async = false>
<CFSET XMLFILE = getDirectoryFromPath(GetCurrentTemplatePath()) & "bestandje.xml">
<CFSET DataBestand.Load(xmlFIL)>
<CFOBJECT action="create" type="COM" class="Microsoft.XMLDOM" name="StyleBestand">
<CFSET StyleBestand.Async = false>
<CFSET XMLFIL = getDirectoryFromPath(GetCurrentTemplatePath()) & "stylebestand.xsl">
<CFSET StyleBestand.Load(xmlFIL)>

<cfset result = DataBestand.transformNode (StyleBestand)>
<cfoutput>#result#</cfoutput>[/code]

  • stean
  • Registratie: November 2000
  • Laatst online: 18-08 22:30
ik ga het proberen...
mijn dank is groot, want zat even helemaal vast :P

edit:
de regel:<CFSET DataBestand.Load(xmlFIL"E")> moet nog een "E" achter.

(in verband met hoofdletters in xml raad ik aan de rest ook eve goed te zetten)
code:
1
2
3
4
5
6
7
8
9
10
11
12
<CFOBJECT action="create" type="COM" class="Microsoft.XMLDOM" name="DataBestand">
            <CFSET DataBestand.Async = false>
            <CFSET xmlFILE = getDirectoryFromPath(GetCurrentTemplatePath()) & "testxml.xml">
            <CFSET DataBestand.Load(xmlFILE)>

            <CFOBJECT action="create" type="COM" class="Microsoft.XMLDOM" name="StyleBestand">
            <CFSET StyleBestand.Async = false>
            <CFSET xmlFIL = getDirectoryFromPath(GetCurrentTemplatePath()) & "naarhtml.xsl">
            <CFSET StyleBestand.Load(xmlFIL)>
            
            <cfset result = DataBestand.transformNode (StyleBestand)>
            <cfoutput>#result#</cfoutput>

vooral dat "transformNode" eigenschap had ik nodig :9

Verwijderd

Op woensdag 06 maart 2002 10:29 schreef stean het volgende:
ik ga het proberen...
mijn dank is groot, want zat even helemaal vast :P

edit:
de regel:<CFSET DataBestand.Load(xmlFIL"E")> moet nog een "E" achter.

(in verband met hoofdletters in xml raad ik aan de rest ook eve goed te zetten)
code:
1
2
3
4
5
6
7
8
9
10
11
12
<CFOBJECT action="create" type="COM" class="Microsoft.XMLDOM" name="DataBestand">
            <CFSET DataBestand.Async = false>
            <CFSET xmlFILE = getDirectoryFromPath(GetCurrentTemplatePath()) & "testxml.xml">
            <CFSET DataBestand.Load(xmlFILE)>

            <CFOBJECT action="create" type="COM" class="Microsoft.XMLDOM" name="StyleBestand">
            <CFSET StyleBestand.Async = false>
            <CFSET xmlFIL = getDirectoryFromPath(GetCurrentTemplatePath()) & "naarhtml.xsl">
            <CFSET StyleBestand.Load(xmlFIL)>
            
            <cfset result = DataBestand.transformNode (StyleBestand)>
            <cfoutput>#result#</cfoutput>

vooral dat "transformNode" eigenschap had ik nodig :9
Ik code altijd in lowercaps :) Alleen dit forum biedt voor ColdFusion geen code highlighting vandaar dat ik het eventjes voor je had gewijzigd ter overzichtelijkheid :)
Pagina: 1