ValidatorHandler 提供了 TypeInfoProvider,ContentHandler 可以隨時調(diào)用查看當前元素或其屬性的類型。它還可以告訴您該屬性是否是 ID,屬性是在文檔中明確指定的還是模式中的默認值。清單 6 對這個類作了概括。
清單 6. TypeInfoProvider 類
package javax.xml.validation;
public abstract class TypeInfoProvider {
public abstract TypeInfo getElementTypeInfo();
public abstract TypeInfo getAttributeTypeInfo(int index);
public abstract boolean isIdAttribute(int index);
public abstract boolean isSpecified(int index);
}
最后,用 SAX XMLReader 解析文檔。清單 7 是一個簡單的程序,它利用了所有這些類和接口打印出文檔所有元素的類型名。
清單 7. 列舉元素類型
import java.io.*;
import javax.xml.validation.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
public class TypeLister extends DefaultHandler {
private TypeInfoProvider provider;
public TypeLister(TypeInfoProvider provider) {
this.provider = provider;
}
public static void main(String[] args) throws SAXException, IOException {
SchemaFactory factory
= SchemaFactory.newInstance("http://www.w3.org/2001/XMLSchema");
File schemaLocation = new File("/opt/xml/docbook/xsd/docbook.xsd");
Schema schema = factory.newSchema(schemaLocation);
ValidatorHandler vHandler = schema.newValidatorHandler();
TypeInfoProvider provider = vHandler.getTypeInfoProvider();
ContentHandler cHandler = new TypeLister(provider);
vHandler.setContentHandler(cHandler);
XMLReader parser = XMLReaderFactory.createXMLReader();
parser.setContentHandler(vHandler);
parser.parse(args[0]);
}
public void startElement(String namespace, String localName,
String qualifiedName, Attributes atts) throws SAXException {
String type = provider.getElementTypeInfo().getTypeName();
System.out.println(qualifiedName + ": " + type);
}
}
相關(guān)推薦:北京 | 天津 | 上海 | 江蘇 | 山東 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
廣東 | 河北 | 湖南 | 廣西 | 河南 |
海南 | 湖北 | 四川 | 重慶 | 云南 |
貴州 | 西藏 | 新疆 | 陜西 | 山西 |
寧夏 | 甘肅 | 青海 | 遼寧 | 吉林 |
黑龍江 | 內(nèi)蒙古 |