JAXP严格来说我觉得只能算是一个解析XML的抽象层,Java应用可以通过Jaxp支持多种处理xml的底层实现,在API上沿用了w3c的Dom和Sax接口,乏善可陈。事实上Dom4j通过支持Jaxp也可以拥有Jaxp这层抽象的优点,不明白sun为什么不在Jaxp这层抽象上定义更好用的接口。
1、使用Sax接口
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(new File(args[0]), new MyHandler());
//定义Sax回调实现
class MyHandler extends DefaultHandler {
// SAX callback implementations from ContentHandler, ErrorHandler, etc.
}
2、使用Dom接口
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(in);
//一个遍历的简单示例
public void printTree(Node node, String pre)

...{
switch (node.getNodeType())

...{
case Node.ATTRIBUTE_NODE:
System.out.print(pre + node.getNodeName() + " = ");
System.out.println(node.getNodeValue());
break;
case Node.DOCUMENT_NODE:
Document doc = (Document) node;
printTree(doc.getDocumentElement(), "");
break;
case Node.ELEMENT_NODE:
System.out.println(pre + node.getNodeName());
NamedNodeMap map = node.getAttributes();
for (int i = 0; i < map.getLength(); i++)

...{
Node attr = map.item(i);
printTree(attr, pre);
}
NodeList list = node.getChildNodes();
for (int i = 0; i < list.getLength(); i++)

...{
Node child = list.item(i);
printTree(child, pre + " ");
}
break;
case Node.TEXT_NODE:
if (node.getTextContent() == null
|| node.getTextContent().trim().equals(""))

...{
break;
}
System.out.println(pre + node.getTextContent());
break;
default:
break;
}
}输出Document
public void write(Document doc, OutputStream out)
throws TransformerException, UnsupportedEncodingException,
IOException

...{
TransformerFactory tfactory = TransformerFactory.newInstance();
Transformer former = tfactory.newTransformer();
Source source = new DOMSource(doc);
StringWriter buffer = new StringWriter();
StreamResult result = new StreamResult(buffer);
former.transform(source, result);
out.write(buffer.toString().getBytes("GBK"));
}

上面的DefaultHandler和Document都是w3c定义的,对Java来说都算不上友好。