Java XML解析之 JAXP

        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来说都算不上友好。

 

你可能感兴趣的:(java,xml,sun)