UML软件工程组织

整合Java与XML的新应用(3)
作者:谷和启 本文选自:开放系统世界——赛迪网 2002年11月20日

运行“java IsXML AvailableDTD PeopleDTD.xml”命令,如果XML文件有效符合DTD的定义,程序则会提示“XML文件有效!”。

显示XML 数据的两种方法和XSLT

1.调用CSS 文件

(1) 编写一个hell.css 的样式单;

编写语句为“hello{display:block;font-size:48pt;font-weight:bold;font-style:italic;}”,其中的hello 是样式单的名称,随后定义的属性display、font-size、font-weight 和font-style 分别表示文字采用块(block)显示、文字的大小为48磅、文字是粗体、字体是斜体。

(2) 编写XML 文件。

在XML 文件中,如1.xml,加入一行代码为,1.xml 源程序代码如下:

<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/css" href="hello.css"?>
<hello>
Hello,the world!
</hello>

2.调用XSL 文件

通过语句“<? xml-stylesheet type="text/xsl" href="2.xsl"?>”在XML 文件中调用2.xsl 文件。其中通过“type="text/xsl"”属性定义文件类型、“href="2.xsl"”属性用于定义引用文件的路径。语句格式如下:

<xsl:for-each select="hello">
<h1>
<xsl:value-of/>
</h1>
</xsl:for-each>

其中“<xsl:for-each select="hello">”用来选择"hello"元素,而“<xsl:value-of/>”是一个空标记,用来显示元素“<hello>”的内容。2.xml 文件的源代码如下:

<?xml version="1.0" standalone="yes"?>
<?xml-stylesheet type="text/xsl" href="2.xsl"?>
<hello>
Hello,the world!
</hello>

2.xsl 文件的源代码如下:

<?xml version="1.0" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/TR/WD-xsl">
<xsl:template match="/">
<html>
<body>
<xsl:for-each select="hello">
<h1>
<xsl:value-of/>
</h1>
</xsl:for-each>
</body>
</html>
</xsl:template>
</xsl:stylesheet>

3.XSLT

XSLT(XSL Transformations) 主要用于处理和输出XML 文档。处理功能指的是对XML 文档进行转换,对XML 文档中的元素进行提取、排序等操作。输出功能则是指用某种方式表现XML 文档。通过使用XSLT开发者可以描述一种从现有的XML 文档建立新的结构化文档的方法,而这种方法由XSLT引擎来实现。XSLT并不是一种编程语言。它的实现方法是给出实例,而不是描述执行过程。

XSLT是将模式(Pattern)与模板(Template)相结合实现的。模式与源树中的元素相匹配。模板被实例化产生部分结果树,结果树与源树是分离的,并且结果树的结构可以和源树截然不同。在结果树的构造中源树可以被过滤和重新排序,还可以增加任意的结构。

下面我们建立自己的XSLT,先将所需要用到的包加载到程序中。MyTransformer 的结构和DOM 及 SAX 很像,都有一个XXXFactory 和相对应的错误。除了基本的对象外MyTransformer 还需要加载DOMSource 和 StreamResult两个对象,分别作为Transformer 的输入和输出。

MyTransformer 的源代码如下:

//MyTransformer.java
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.FactoryConfigurationError;
import javax.xml.parsers.Parser ConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory ConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import java.io.File;
import org.w3c.dom.Document;
public class MyTransformer {
public static void main(String[] args) {
if(args.length != 1){
System.out.println("java MyTransformer [目的文件]");
return;
}
DocumentBuilderFactory domFactory =
DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
domFactory.setValidating(true);
try {
DocumentBuilder domParser = domFactory. newDocumentBuilder();
Document doc = domParser.parse(args[0]);
TransformerFactory factory =
TransformerFactory.newInstance();
Transformer transformer =
factory.newTransformer();
DOMSource source = new DOMSource(doc);
StreamResult target = new StreamResult(System.out);
transformer.transform(source, target);
}catch ( FactoryConfigurationError fce ) {
System.err.println("domFactory设置错误"
+ fce.getMessage() );
}catch ( ParserConfigurationException pce ) {
System.err.println("domBuilder设置错误"
+ pce.getMessage() );
}catch ( Exception e ) {
System.err.println("其他错误"
+ e.getMessage() );
e.printStackTrace();
}
}
}

XML 编程接口—DOM 和 SAX

1. DOM 编程

DOM 是一套为合法的Well-Formed 文件设计的API(应用程序接口),它同时定义了这些文件的逻辑结构、访问及操作方法。在DOM 的规范里,文件的定义很广泛,其中包括了HTML 和XML。所以,DOM 也可以用来操作XML 及 HTML 文件,也可以用DOM 建立文件、浏览文件结构以及增加或删除文件的某些内容。



版权所有:UML软件工程组织