XML解析——dom

DOM

<?xml version="1.0" encoding="UTF-8"?>
<order>
    <orderitem>
        <product name="xx"></product>
    </orderitem>
</order>
 
使用Document类代表一个XML文件
DOM解析思路
1.先将XML文件转换为一个Document对象
2.从Document对象上获取根元素
3.通过根元素找其下面的子元素
4.通过元素类型找出Element元素orderitem
5.通过orderitem找出其下子元素
6.通过元素的类型来找出Element元素product
7.通过product找出属性name
 
src\cn\itcast\cd\dom\products.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<products>
    <product sn="001">
        <name>大米</name>
        <price>29.8</price>
        <unit>袋</unit>
        <weight>5</weight>
    </product>
    <product sn="002">
        <name>馒头</name>
        <price>0.5</price>
        <unit>个</unit>
        <weight>0.02</weight>
    </product>
</products>
 
src\cn\itcast\cd\dom\Product.java
package cn.itcast.cd.dom;
 
public class Product {
 
    private String sn;
    private String name;
    private Double price;
    private String unit;
    private Double weight;
 
    public String getSn() {
        return sn;
    }
 
    public void setSn(String sn) {
        this.sn = sn;
    }
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public Double getPrice() {
        return price;
    }
 
    public void setPrice(Double price) {
        this.price = price;
    }
 
    public String getUnit() {
        return unit;
    }
 
    public void setUnit(String unit) {
        this.unit = unit;
    }
 
    public Double getWeight() {
        return weight;
    }
 
    public void setWeight(Double weight) {
        this.weight = weight;
    }
 
    @Override
    public String toString() {
        return "product:" + "[" + sn + "," + name + "," + price + "," + unit + "," + weight + "]";
    }
 
 
}
Product是一个Product实体类
 
src\cn\itcast\cd\dom\ProductDAO.java
package cn.itcast.cd.dom;
 
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
 
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
 
import org.w3c.dom.Attr;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
 
import cn.itcast.cd.dom.Product;
 
public class ProductDAO {
 
    // 当前CLASSPATH
    private String xmlFilePath;
 
    public ProductDAO() {
        super();
    }
 
    public ProductDAO(String xmlFilePath) {
        this();
        this.xmlFilePath = xmlFilePath;
    }
 
    // 获取一个xml文件的Document对象
    private Document getDocument() {
        Document document = null;
        try {
 
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory
                    .newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory
                    .newDocumentBuilder();
            document = documentBuilder.parse(new File(this.xmlFilePath));
 
        } catch (Exception e) {
            e.printStackTrace();
        }
 
        return document;
    }
 
    // 将在内在中创建的xml写入到文件
    private void saveDocument(Document document) {
        Source xmlSource = new DOMSource(document);
        Result outputTarget = new StreamResult(
                new File(
                        "E:/Work/Workspace/MySelf/eclipse/day3/src/cn/itcast/cd/dom/products.xml"));
 
        try {
            Transformer transformer = TransformerFactory.newInstance()
                    .newTransformer();
            transformer.transform(xmlSource, outputTarget);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    // 获取xml文件中所有的Product
    public List<Product> list() {
        List<Product> list = new ArrayList<Product>();
 
        Document document = getDocument();
        NodeList productNodes = document.getElementsByTagName("product");
 
        for (int i = 0; i < productNodes.getLength(); i++) {
            Element productElement = (Element) productNodes.item(i);
            Product product = new Product();
            product.setSn(productElement.getAttribute("sn"));
            product.setName(productElement.getElementsByTagName("name").item(0)
                    .getTextContent());
            product.setPrice(Double.parseDouble(productElement
                    .getElementsByTagName("price").item(0).getTextContent()));
            product.setUnit(productElement.getElementsByTagName("unit").item(0)
                    .getTextContent());
            product.setWeight(Double.parseDouble(productElement
                    .getElementsByTagName("weight").item(0).getTextContent()));
 
            list.add(product);
        }
 
        return list;
    }
 
    // 通过Product的sn获取一个Product
    public Product getBySn(String sn) {
        Product product = new Product();
 
        Document document = getDocument();
        NodeList productNodes = document.getElementsByTagName("product");
 
        for (int i = 0; i < productNodes.getLength(); i++) {
            Element productElement = (Element) productNodes.item(i);
 
            if (productElement.getAttribute("sn").equals(sn)) {
 
                product.setSn(productElement.getAttribute("sn"));
                product.setName(productElement.getElementsByTagName("name")
                        .item(0).getTextContent());
                product.setPrice(Double
                        .parseDouble(productElement
                                .getElementsByTagName("price").item(0)
                                .getTextContent()));
                product.setUnit(productElement.getElementsByTagName("unit")
                        .item(0).getTextContent());
                product.setWeight(Double.parseDouble(productElement
                        .getElementsByTagName("weight").item(0)
                        .getTextContent()));
 
                break;
            }
        }
 
        return product;
    }
 
    // 在xml文件中添加一个Product
    public void add(Product product) {
        Document document = getDocument();
 
        // 创建product元素
        Element productElement = document.createElement("product");
        // 创建product的name子元素
        Element nameElement = document.createElement("name");
        // 创建product的price子元素
        Element priceElement = document.createElement("price");
        // 创建product的unit子元素
        Element unitElement = document.createElement("unit");
        // 创建product的weight子元素
        Element weightElement = document.createElement("weight");
 
        // 给product元素添加sn属性
        productElement.setAttribute("sn", product.getSn());
 
        // 给product元素添加name子元素
        productElement.appendChild(nameElement);
        nameElement.setTextContent(product.getName());
 
        // 给product元素添加price子元素
        productElement.appendChild(priceElement);
        priceElement.setTextContent(product.getPrice().toString());
 
        // 给product元素添加unit子元素
        productElement.appendChild(unitElement);
        unitElement.setTextContent(product.getUnit());
 
        // 给product元素添加name子元素
        productElement.appendChild(weightElement);
        weightElement.setTextContent(product.getWeight().toString());
 
        // 获取根元素
        Element rootElement = document.getDocumentElement();
        // 在根元素下添加product元素
        rootElement.appendChild(productElement);
 
        // 将内存中XML树写入文件
        saveDocument(document);
 
    }
 
    // 通过Product的sn删除xml文件中的一个Product
    public void remove(String sn) {
        Document document = getDocument();
 
        Element rootElement = document.getDocumentElement();
        NodeList productNodes = document.getElementsByTagName("product");
 
        for (int i = 0; i < productNodes.getLength(); i++) {
            Element productElement = (Element) productNodes.item(i);
 
            if (productElement.getAttribute("sn").equals(sn)) {
 
                rootElement.removeChild(productElement);
                saveDocument(document);
                break;
            }
        }
    }
 
    // 修改xml文件中Product
    public void modify(Product product) {
        Document document = getDocument();
 
        NodeList productNodes = document.getElementsByTagName("product");
 
        for (int i = 0; i < productNodes.getLength(); i++) {
            Element productElement = (Element) productNodes.item(i);
 
            if (productElement.getAttribute("sn").equals(product.getSn())) {
 
                productElement.getElementsByTagName("name").item(0).setTextContent(product.getName());
                productElement.getElementsByTagName("price").item(0).setTextContent(product.getPrice().toString());
                productElement.getElementsByTagName("unit").item(0).setTextContent(product.getUnit());
                productElement.getElementsByTagName("weight").item(0).setTextContent(product.getWeight().toString());
 
                saveDocument(document);
 
                break;
            }
        }
    }
}
ProductDAO是一个Domain Access Object
 
src\cn\itcast\cd\dom\ProductTest.java
package cn.itcast.cd.dom;
 
public class ProductTest {
 
    public static void main(String[] args) {
        String currentPath = ProductDAO.class.getResource("").getPath()
                + "products.xml";
 
        ProductDAO productDAO = new ProductDAO(currentPath);
 
        // 获取xml文件中所有的Product
 
        /*for (Product product : productDAO.list()) {
            System.out.println(product);
        }*/
 
        // 通过Product的sn获取一个Product
        /*System.out.println(productDAO.getBySn("002"));*/
 
        /* Product product = new Product();
         product.setSn("003");
         product.setName("馒头");
         product.setPrice(0.5);
         product.setUnit("个");
         product.setWeight(0.02);*/
 
         // 添加一个Product
        /* productDAO.add(product);*/
 
        // 通过sn删除xml中的一个Product
        /*productDAO.remove("003");*/
 
        /*Product product = new Product();
        product.setSn("002");
        product.setName("馒头");
        product.setPrice(0.5);
        product.setUnit("个");
        product.setWeight(0.02);*/
 
        // 修改xml中的一个Product
        /*productDAO.modify(product);*/
    }
 
}
ProductTest是一个测试类
 
 





posted @ 2012-04-02 10:35  jungor  阅读(216)  评论(0)    收藏  举报