Java XML解析之 JAXP

本文介绍了Java API for XML Processing (JAXP) 的基本概念及其如何为Java应用程序提供解析XML文档的能力。文中通过示例代码展示了如何使用SAX和DOM接口来解析XML文件,并讨论了JAXP作为抽象层的优势及不足。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值