DOM解析(JavaWeb)

定义一个XML文件

<?xml version="1.0" encoding="UTF-8"?>
<contact>
    <member id="10001">
        <name>旺财</name>
        <phone>110</phone>
        <address>狗窝</address>
    </member>
    <member id="10002">
        <name>西门庆</name>
        <phone>120</phone>
        <address>猪窝</address>
    </member>
</contact>

DOM 树指的是按照元素的结构进行数据的保存(数据保存在内存之中)处理过程。
在Java允许解析的过程中,会解析成如下图所示:
DOM树
当要通过程序实现DOM解析处理的时候,所以被读取到程序之中的XML文件都会自动的转换为以上形式的DOM树。所以最终的解析解析的并不是文件,而是内存中的DOM树。


在Java中,整个的DOM解析出来。每一个保存的内容的位置都称为节点(Node)。
DOM继承关系
1、在XML的解析处理过程中,最大的接口为org.w3c.dom.Node接口,在Node接口里面提供有如下的几个主要方法:

追加新的子节点:
public Node appendChild(Node newChild) throws DOMException
取得当前节点下的所有子节点
public NodeList getChildsNode()
取得当前节点下的第一个子节点
public Node getFirstNode()
取得节点名称
public String getNodeName()
取得节点的内容
public String getNodeValue() throws DOMException
取得当前节点的父节点
public Node getParentNode()
取得节点中的文本内容
public String getTextContent() throws DOMException
删除当前节点中的指定子节点
public Node removeChild(Node oldChild) throws DOMException
设置节点内容
public void setNodeValue(String nodeValue) throws DOMException
设置节点文本内容
public void setTextContent(String textContent) throws DOMException

2、元素子接口(Element),只要使用了“<>”括起来的内容都称为元素,在Element接口中有如下几个操作方法:

取得该元素在中指定属性的内容
public String getAttribute(String name)
设置该元素中的属性名称以及内容
public void setAttribute(String name,String value) throws DOMException
取得指定元素中知道名称的所有子元素
public NodeList getElementsByTagName(String name)
取得指定元素的标签名称
public String getTagName()
删除元素的指定属性信息
public void removeAttribute(String name)throws DOMException

3、 描述整个文档的接口:Document,一个Document中会包含有多个Element,Document 描述的是整个文档,所有的元素以及文本都需要通过此接口创建,而且文本也一定是保存在元素之内的。在Document接口里定义有如下方法:

创建新元素
public Element createElement(String tagName) throws DOMException
创建文本节点,并设置文本的内容
public void createTextNode(String data)
找到文本中的所有指定元素的几点对象
public NodeList getElementsByTagName(String tagName)

4、 在Node接口中还提供有一个Text子接口,描述的是文本信息。


关于DOM的解析和创建
如果要进行DOM 的操作处理,核心的启动接口:Document,因为使用Document 可以创建元素,而后元素可以创建属性,Document 又可以创建文本。但是现在的问题是Document 是一个接口,所以如果要想使用这个接口就必须为其进行实例化的操作处理,如果要想取得Document 接口对象则需要以下几个类的支持:
1、 文档解析工厂类:javax.xml.parsers.DocumentBuilderFactory,这是一个抽象类,在这个类中提供有如下方法:
①取得DocumentBuilderFactory 类实例化对象:
public static DocumentBuilderFactory newInstance();
②创建DocumentBuilder 类对象:
public abstract DocumentBuilder newDocumentBuilder() throws ParserConfigurationException;
2、 文档创建类:javax.xml.parsers.DocumentBuilder,在这个类中定义有如下方法:
①创建一个新的文档:
public abstract Document newDocument();
②解析XML 文档:
public Document parse(InputStream is) throws SAXException, IOException;
3、 在进行XML 文件解析的时候如果返回的是多个节点,则使用“org.w3c.dom.NodeList”接口描述,在接口之中定义如下方法:
· 取得返回的节点个数:public int getLength();
· 根据指定索引取得指定节点:public Node item(int index),可能是Element、Text、Document。
在内存中将指定的XML 输入流变为DOM 树;
DOM解析流程


范例:
要解析的DOM 文件:

<?xml version="1.0" encoding="UTF-8"?>
<contact>
    <member id="10001">
        <name>旺财</name>
        <phone>110</phone>
        <address>狗窝</address>
    </member>
    <member id="10002">
        <name>西门庆</name>
        <phone>120</phone>
        <address>猪窝</address>
    </member>
</contact>
public class DOMReadMember {
    public static void main(String[] args) throws Exception {
        // 1、定义要读取文件的输入流对象
        File file = new File("E:" + File.separator + "contact.xml");
        // 2、在进行解析的处理过程之中需要的是InputStream
        InputStream inputStream = new FileInputStream(file) ;
        // 3、创建DocumentBuilderFactory类对象实例,必须依靠此类才可以创建DocumentBuilder
        // 4、通过DocumentBuilderFactory创建DocumentBuilder类对象,依靠此类对象才可以创建或解析Document
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder() ;
        // 5、通过DocumentBuilder解析出Document对象,此时是通过输入流读取解析,这个时候形成了DOM树
        Document document = documentBuilder.parse(inputStream) ;
        // 6、在整个文档之中取得所有的member标签元素
        NodeList memberList = document.getElementsByTagName("member") ;
        for (int x = 0; x < memberList.getLength(); x++) {
        // NodeList接口中的item()方法的返回类型为Node,但是如果要想取得元素属性内容需要Element
        Element memberElement = (Element) memberList.item(x) ;
        String id = memberElement.getAttribute("id") ; // 取得id属性
        String name =((Element)memberElement.getElementsByTagName("name").item(0)).getFirstChild().getNodeValue() ;
        String phone = ((Element)memberElement.getElementsByTagName("phone").item(0)).getFirstChild().getNodeValue() ;
        String address = ((Element)memberElement.getElementsByTagName("address").item(0)).getFirstChild().getNodeValue() ;
        System.out.println("id = " + id + "、name = " + name +"、phone = " + phone + "、address = " + address);
        } inputStream.close();
    }
}

DOM创建XML文件
1、 转换输出工厂类:javax.xml.transform.TransformerFactory
①取得TransformerFactory类对象:
public static TransformerFactory newInstance() throws TransformerFactoryConfigurationError;
②取得Transformer类对象:
public abstract Transformer newTransformer() throws TransformerConfigurationExcep;
2、 转换处理类:javax.xml.transform.Transformer.
①设置输出属性:
public abstract void setOutputProperties(Properties oformat)
②转换输出:
public abstract void transform(Source xmlSource, Result outputTarget) throws TransformerException;
3、 数据源操作接口,指的是如何取得所需要的数据(javax.xml.transform.Source):
现在需要进行的是DOM数据的解析处理,所以使用DOMSource子类;
4、 数据输出流接口(javax.xml.transform.Result):
此时是向文件之中进行输出控制,所以使用:StreamResult;
DOM输出

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值