关于JAXP的问题,请大家一同来探讨吧! (100分)

  • 主题发起人 主题发起人 delphiasp
  • 开始时间 开始时间
D

delphiasp

Unregistered / Unconfirmed
GUEST, unregistred user!
有了解了一下JAXP的,也看了孙老师的贴子,感觉不研究一下,有点落后,这不一看JAXP的
文档,再想看一下例子的效果,出了问题了:
我把jaxp-1.1/examples/UseStylesheetParam目录下的UseStylesheetParam.java编译
成了UseStylesheetParam.class文件,现在我想知道要如何继续检验这个例子呢?
另外还有没有相关的资料呢?
 
探讨一下吧。那个东东挺烦的。提供的例子都是很简单的一个XML。
不过,这个有点简单,你跟上一个参数,然后,它把foo.xml用foo.xsl
来表示,并且将参数换成你输入的内容。详情请读源码。
我运行:
javac -cp c:/jaxp-1.1/jaxp.jar;c:/jaxp-1.1/crimson.jar;c:/jaxp-1.1/xalan.jar
UseStylesheetParam wangfc
得到:
<?xml version="1.0" encoding="UTF-8"?>
<out>wangfc</out>
 
To 王福川:
   应该是java这个命令吧?
我用了,也加了-cp 但是还是出现下面的异常:
Exception in thread "main" java.lang.NoClassDefFoundError:
 

不好意思,写错了。
java -cp c:/jaxp-1.1/jaxp.jar;c:/jaxp-1.1/crimson.jar;c:/jaxp-1.1/xalan.jar;.
UseStylesheetParam wangfc
 
还是出现:
Exception in thread "main" java.lang.NoClassDefFoundError: UseStylesheetParam
请王兄帮忙一下了
 
classpath 中的 .;
非常重要,王兄把它写在后面不起眼可以这样:
java -cp .;c:/jaxp-1.1/jaxp.jar;.........
^
 
rooms.xml:
<?xml version="1.0" encoding="gb2312" ?>
<DFWML type="简单分类列表">
<ROOM ID="1">Delphi - 非技术问题</ROOM>
<ROOM ID="2">Delphi - 数据库 - 文件型</ROOM>
<ROOM ID="3">Delphi - 数据库 - C/S型</ROOM>
<ROOM ID="4">Delphi - 控件 - 开发</ROOM>
<ROOM ID="5">Delphi - 控件 - 使用</ROOM>
<ROOM ID="6">Delphi - OLE / Automation</ROOM>
<ROOM ID="7">Delphi - ActiveX 控件</ROOM>
<ROOM ID="8">Delphi - 图形图象</ROOM>
<ROOM ID="9">Delphi - 局域网 / 通讯</ROOM>
<ROOM ID="10">Delphi - Internet / TCPIP</ROOM>
<ROOM ID="11">Delphi - 系统相关</ROOM>
<ROOM ID="12">Delphi - IDE / 使用技巧</ROOM>
<ROOM ID="16">Delphi - 多媒体</ROOM>
<ROOM ID="17">Delphi - 报表 / 统计图形</ROOM>
<ROOM ID="25">Delphi - Windows API</ROOM>
<ROOM ID="26">Delphi - Object Pascal</ROOM>
<ROOM ID="29">Delphi - 打印</ROOM>
<ROOM ID="30">Delphi - 多线程</ROOM>
<ROOM ID="31">Delphi - MIDAS / DCOM</ROOM>
<ROOM ID="61">Delphi - 包装发布</ROOM>
<ROOM ID="44">Java - Java</ROOM>
<ROOM ID="45">Java - JSP/Servlet</ROOM>
<ROOM ID="54">Kylix - Linux基础/安装</ROOM>
<ROOM ID="55">Kylix - Linux数据库</ROOM>
<ROOM ID="56">Kylix - 用户界面</ROOM>
<ROOM ID="57">Kylix - 通讯/网络</ROOM>
<ROOM ID="58">Kylix - apache</ROOM>
<ROOM ID="59">Kylix - Linux图形/图象</ROOM>
<ROOM ID="62">Kylix - 包装发布</ROOM>
<ROOM ID="33">程序员 - 发烧友联谊会</ROOM>
<ROOM ID="34">程序员 - 混合语言编程</ROOM>
<ROOM ID="42">程序员 - 编程手记</ROOM>
<ROOM ID="43">程序员 - 新作发表</ROOM>
<ROOM ID="51">程序员 - 编程心得</ROOM>
<ROOM ID="35">供求区 - 请您翻译</ROOM>
<ROOM ID="36">供求区 - 供求热线</ROOM>
<ROOM ID="37">供求区 - 招聘/求职/兼职</ROOM>
<ROOM ID="49">基础篇 - 软件工程</ROOM>
<ROOM ID="50">基础篇 - 数据结构</ROOM>
<ROOM ID="41">新技术 - 电子商务</ROOM>
<ROOM ID="48">新技术 - 前沿技术</ROOM>
<ROOM ID="52">新技术 - XML</ROOM>
<ROOM ID="53">新技术 - GIS</ROOM>
<ROOM ID="32">站务区 - 建议和意见</ROOM>
<ROOM ID="47">站务区 - 软件协会</ROOM>
<ROOM ID="60">站务区 - 信息发布</ROOM>
</DFWML>
 
room0.xsl:
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="gb2312"/>
<xsl:template match="/">
<xsl:for-each select="DFWML/ROOM">
<xsl:value-of select="."/>
<xsl:text>&amp;#xA;&amp;#xD;</xsl:text>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
 
rooms1.xsl
<?xml version="1.0" encoding="gb2312"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
<xsl:output method="text" encoding="gb2312"/>
<xsl:template match="/">
<xsl:apply-templates select="DFWML/ROOM"/>
</xsl:template>
<xsl:template match="DFWML/ROOM">
<xsl:value-of select="."/>
<xsl:text>&amp;#xA;&amp;#xD;</xsl:text>
</xsl:template>
</xsl:stylesheet>
 
给您一个简单例子 testXML.java
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
public class testXML {
public static void main(String[] args) {
try {
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer transformer = tfactory.newTransformer(new StreamSource(args[1]));
transformer.transform( new StreamSource(args[0]), new StreamResult(System.out));
}
catch(Exception e) {
System.err.println(e.toString());
}
}
}
编译:C:/>javac -classpath c:/jaxp-1.1/xalan.jar testXML.java
运行:
java -classpath .;c:/jaxp-1.1/xalan.jar testXML rooms.xml rooms0.xsl
java -classpath .;c:/jaxp-1.1/xalan.jar testXML rooms.xml rooms1.xsl
 
一些说明:
1.Xalan 中包括了 JAXP 所有东西, 所以只要一个 xalan.jar 就够了.
2.room0.xsl 是最基本的 XSL 功能.
3.room1.xsl 是最新的 XSLT 1.0 的功能.XSLT1.0 支持 xsl:template 编程,
用这个方法可做数据表在客户端的连接, 以提高数据库驱动的 web 应用的效率.
以本论坛问题分类页为例,现有2个数据表
分类表 rooms, 有字段 id, room(分类名称), master(版主)... 记录 46 条
问题表 letters, 有字段 id, roomid(分类id), status(0-1:待答;2:已答)...记录40万条
如何制作问题分类页,显示列表如下:
分类名称,待答问题总数,已答问题总数,版主
..........................................
传统方法:
做 query1: select roomid, count(*) from letters where status<2 group by roomid
做 query2: select roomid, count(*) from letters where status=2 group by roomid
做 query3: select * from rooms, query1, query2 用 2个 left join 连接起来
query3 就是所需要的问题分类页,而生成 query3 是非常慢的! 而且在服务器端执行。
现在用 XSLT 的方法,query3 只要简单的 select * from rooms 就可以了, 2个 left join 连接
在客户端用 XSLT 完成,服务器负担减轻, 整体系统效率提高不少。具体程序可以参考 :
http://www.delphibbs.com/delphibbs/listroom_.asp
http://www.delphibbs.com/delphibbs/listroom_2.xsl
4.Xalan 支持 XSLT 1.0, MSXML 也支持 XSLT 1.0.
但是 IE 5 只支持 XSL, IE 6 才支持 XSLT. Netscape 什么都不支持.
这就是我放弃 Netscape, 并强迫大家使用 MSXML 的原因 :)
 
孙老师,jaxp-1.1 在哪里有下载, 你以前写的关于jaxp的文章链接在那里。
我没 jaxp , 但我找了一下硬盘,发现JBUILDER,TOMCAT,JDK 都有jaxp.jar 这个文件,
面 orion 中 有jaxp.jar和 xalan.jar. 所以,我就把 orion 这一目录加到classpath中,
C:/>javac -classpath c:/orion/xalan.jar testXML.java
不过不行,出现8个错误,如下
testXML.java:1: 包 javax.xml.transform 不存在
import javax.xml.transform.*;
^
testXML.java:2: 包 javax.xml.transform.stream 不存在
import javax.xml.transform.stream.*;
^
testXML.java:7: 不能解析符号
符号:类 TransformerFactory
位置:类 in testXML
TransformerFactory tfactory = TransformerFactory.newInstance();
是不是我一定要用 JAXP 才能完成上面的例子。 TOMCAT4 中包含处理XML的包吗?
谢谢

 
要用jaxp-1.1中最新的 xalan.jar.
jaxp-1.1 下载 http://java.sun.com/xml/download.html
以前的讨论: http://www.delphibbs.com/delphibbs/dispq.asp?lid=533372
 
谢谢孙老师。
第一个java -classpath .;c:/jaxp-1.1/xalan.jar testXML rooms.xml rooms0.xsl
运行可以显示出数据,但是第二个
java -classpath .;c:/jaxp-1.1/xalan.jar testXML rooms.xml rooms1.xsl
就抛出了异常了:javax.xml.transform.TransformerConfigurationException:
org.aqache.crimson.parser/P-019
看了第一个例子,有点意思了,但是我不知xalan.jar与testXML的具体的Web中的作用
是怎么样的,它总不会像msxml.cab也下到客户端来作用?
 
好的,新东东。
我要再深入研究一下,做一点像样的东西出来
Xalan 使用方法: http://xml.apache.org/xalan-j/usagepatterns.html
 
Xalan 使用方法: http://xml.apache.org/xalan-j/usagepatterns.htm
上面我是举例说明 XSLT 的作用, 在 web 应用中得靠浏览器支持 (IE5+MSXML, IE6).
JAXP / xalan.jar 主要用于您自己的程序, JAXP 将包含在 jdk 1.4 中.
就象左轻侯在他的 Delphi 离线阅读器里使用 MSXML 那样,
如果您用Java写离线阅读器,就可以使用 JAXP 来处理 DFWML.
 
再给一个 XPATH 的例子 testXPath.java
import java.io.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.w3c.dom.traversal.*;
import org.apache.xpath.*;
public class testXPath {
public static void main(String[] args) {
try {
do
cumentBuilderFactory dfactory =do
cumentBuilderFactory.newInstance();
do
cumentdo
c = dfactory.newDocumentBuilder().parse(new File("c://rooms.xml"));
String xpath = "/DFWML/ROOM[@ID<10]";
NodeIterator nl = XPathAPI.selectNodeIterator(doc, xpath);
Node n;
while ( (n = nl.nextNode())!= null) {
byte[] buf = n.getFirstChild().getNodeValue().getBytes("GB2312");
System.out.println(new String(buf));
}
}
catch(Exception e) {
System.err.println(e.toString());
}
}
}
编译: C:/>javac -classpath c:/jaxp-1.1/xalan.jar testXPath.java
运行: C:/>java -classpath .;c:/jaxp-1.1/xalan.jar testXPath
这个例子演示了用 XPATH 检索 C:/rooms.xml 中 ID<10 的分类.
XPATH 的语法:
http://msdn.microsoft.com/library/psdk/xmlsdk/xslr0fjs.htm
http://www.zvon.org/xxl/XPathTutorial/General/examples.html
 
在上面的程序里,修改一下: String xpath = "//*[starts-with(text(),'Java')]";
就是选取 Java 分类, 运行结果:
C:/>java -classpath .;c:/jaxp-1.1/xalan.jar testXPath
Java - Java
Java - JSP/Servlet
有趣吧 :) 仔细看上面贴子给出的 XPATH 参考网页吧.
 
最后一个例子: testChkl.java
import java.net.*;
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.xpath.*;
public class testChkl {
public static void main(String[] args) {
try {
URL url = new URL("http://www.delphibbs.com/delphibbs/chkl.asp?recnum=0");
do
cumentBuilderFactory dfactory =do
cumentBuilderFactory.newInstance();
do
cumentdo
c = dfactory.newDocumentBuilder().parse(url.openStream());
String xpath = "/DFWML/HEADER/RecCount";
Node n = XPathAPI.selectSingleNode(doc, xpath);
if (n != null) {
System.out.println("Today, up to now, the number of the updated letters on delphibbs.com is: " +
n.getFirstChild().getNodeValue());
}
}
catch(Exception e) {
System.err.println(e.toString());
}
}
}
编译: C:/>javac -classpath c:/jaxp-1.1/xalan.jar testChkl.java
运行: C:/>java -classpath .;c:/jaxp-1.1/xalan.jar testChkl
Today, up to now, the number of the updated letters on delphibbs.com is: 180
功能说明:
从大富翁论坛获得 DFWML,分析得到今天目前为止,大富翁论坛中更新贴子的数量.
相当于我在问题"新版大富翁论坛揭密之一:数据提取"(lid=495235)中发布的 Delphi + MSXML 小程序一样的功能.
上面所有的例子再加上些描述可以出篇文章了 :)
//如果使用代理服务器处理
System.getProperties().put("proxySet", "true" );
System.getProperties().put("proxyHost","10.10.10.18");
System.getProperties().put("proxyPort","80");
//如果使用代理服务器需要密码验证
sun.misc.BASE64Encoder B64Encoder = new sun.misc.BASE64Encoder();
String tempString = "yysun:xxxxxx";
String auth = "Basic " + new sun.misc.BASE64Encoder().encode (tempString.getBytes());
URLConnection connection = url.openConnection();
connection.setRequestProperty("Proxy-Authorization", auth);
Documentdo
c = dfactory.newDocumentBuilder().parse(connection.getInputStream());
 
有点明白了,
也就是根据DFW上定义的XML格式,
我可以在本地机了开发一个自己的程序,
与服务上的数据进行交互。
是不是以后的大富翁也是只定义标准,
那么客户端的用户要如何实现,可以自己开发了?
那JAXP技术与JXTA,就是P2P有没有联系,也就是能不能用的上呢?
贴子再保留几天。
 
后退
顶部