Java XML

Java XML

一、XML简介

XML(EXtensible Markup Language),可扩展标记语言

特点:
① XML与操作系统、编程语言的开发平台无关。
② 实现不同系统之间的数据交换。

作用:

① 数据交互。

② 配置应用程序和网站。

③ Ajax基石。

二、文档结构

<?xml version="1.0" encoding="UTF-8"?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="U8650"/>
        <Type name="HW123"/>
        <Type name="HW321"/>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone4"/>
    </Brand>
</PhoneInfo>

<元素名 属性名=“属性值”>元素内容</元素名>

① 属性值用双引号包裹。

② 一个元素可以有多个属性。

③ 属性值中不能直接包含<、“、&。

④ 不建议使用的字符:‘、>。

注意事项:

① 所有XML元素都必须有结束标签。

② XML标签对大小写敏感。

③ XML必须正确的嵌套。

④ 同级标签以缩进对齐。

⑤ 元素名称可以包含字母、数字或其他的字符。

⑥ 元素名称不能以数字或者标点符号开始。

⑦ 元素名称中不能含空格。

三、解析XML技术

1. DOM

基于XML文档树结构的解析。

适用于多次访问的XML文档。

特点:比较消耗资源。

常用接口常用方法说明
Document:表示整个 XML 文档NodeList getElementsByTagName(String Tag)按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName)创建指定标记名称的元素
Node:该文档树中的单个节点NodeList getChildNodes()获取该元素的所有子节点,返回节点集合
Element:XML 文档中的一个元素String getTagName()获取元素名称
public class XmlUtils {
    private Document document;

    public XmlUtils(String url) {
        getDocument(url);
    }

    public Document getDocument() {
        return document;
    }

    // 声明方法获得Document对象的
    private void getDocument(String url) {
        // 获取解析器工厂对象
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        // 从DOM工厂获得DOM解析器
        try {
            DocumentBuilder db = dbf.newDocumentBuilder();
            // 解析XML文档,得到一个Document对象,即DOM树
            this.document = db.parse(url);
        } catch (ParserConfigurationException | IOException | SAXException e) {
            e.printStackTrace();
        }
    }

    // 声明保存XML的方法
    // url: .xml文件相对地址
    // character: 字符编码
    private void saveXml(String url, String character){
        //保存XML文件
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer;
        try {
            transformer = transformerFactory.newTransformer();
            DOMSource domSource = new DOMSource(document);
            //设置编码类型
            transformer.setOutputProperty(OutputKeys.ENCODING, character);
            StreamResult result = new StreamResult(new FileOutputStream(url));
            //把DOM转换为XML文件
            transformer.transform(domSource, result);
        } catch (FileNotFoundException | TransformerException e) {
            e.printStackTrace();
        }
    }

    // 查询输出XML文件中的信息
    public void showXmlInfo(String tagParentName, String parentName, String childName) {
        NodeList parentNodes = document.getElementsByTagName(tagParentName);
        for (int i = 0; i < parentNodes.getLength(); i++) {
            // 将节点集合中的元素取出来
            Node node = parentNodes.item(i);
            Element parent = (Element) node;
            String parentValue = parent.getAttribute(parentName);
            System.out.println(parentValue);
            NodeList childNodes = parent.getChildNodes();
            for (int j = 0; j < childNodes.getLength(); j++) {
                Node childNode = childNodes.item(j);
                if (childNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element child = (Element) childNode;
                    String childValue = child.getAttribute(childName);
                    System.out.println("\t" + childValue);
                }
            }
        }
    }

    // 声明向XML文件中添加数据的方法
    public void addXml(String tagParentName, String parentName, String parentValue,
                       String tagChildName, String childName, String childValue,
                       String tagGrandName, String url, String character) {
        // 创建parent节点
        Element parentElement = document.createElement(tagParentName);
        parentElement.setAttribute(parentName, parentValue);
        // 创建child节点
        Element childElement = document.createElement(tagChildName);
        childElement.setAttribute(childName, childValue);
        // 添加父子关系
        parentElement.appendChild(childElement);
        Element grandElement = (Element) document.getElementsByTagName(tagGrandName).item(0);
        grandElement.appendChild(parentElement);
        // 添加完毕后,保存xml文件
        saveXml(url, character);
    }

    // 修改XML里面的数据
    public void updateXml(String tagParentName, String childName, String oldValue, String newValue,String url, String character) {
        // 找到修改的节点
        NodeList nodeList = document.getElementsByTagName(tagParentName);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element parentElement = (Element) nodeList.item(i);
            String childValue = parentElement.getAttribute(childName);
            if (childValue.equals(oldValue)) {
                parentElement.setAttribute(childName, newValue);
            }
        }
        // 修改完毕后,保存xml文件
        saveXml(url, character);
    }

    // 删除xml文件中的数据
    public void deleteXml(String tagParentName, String childName, String delValue, String url, String character) {
        // 找到删除的节点
        NodeList nodeList = document.getElementsByTagName(tagParentName);
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element parentElement = (Element) nodeList.item(i);
            String childValue = parentElement.getAttribute(childName);
            if (childValue.equals(delValue)) {
                parentElement.getParentNode().removeChild(parentElement);
            }
        }
        // 删除完毕后,保存xml文件
        saveXml(url, character);
    }
    
    // xml文件相对路径
    String url = "src/com/spark/xmlUtils/收藏信息.xml";
    // 创建XmlUtils类
    XmlUtils xmlUtils = new XmlUtils(url);
    // 添加
    // xmlUtils.addXml("Brand","name","MOTO","Type","name","A1680","PhoneInfo",url,"UTF-8");
    // 修改
    // xmlUtils.updateXml("Brand","name","MOTO","摩托罗拉",url,"UTF-8");
    // 删除
    // xmlUtils.deleteXml("Brand","name","MOTO",url,"UTF-8");
    xmlUtils.showXmlInfo("Brand","name","name");
}

2. dom4j

非常优秀的Java XML API。

性能优异、功能强大。

开放源代码。

下载官网:https://dom4j.github.io/#parsing

DOM4j-中文API:https://www.bbsmax.com/A/pRdB6977dn/

public class Dom4j {
    public  Document document;
    public String url = "src/com/spark/xmlUtils/收藏信息.xml";

    public static void main(String[] args) {

    }

    public void loadDocument() {
        SAXReader saxReader = new SAXReader();
        try {
            document = saxReader.read(new File(url));
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    public void saveXML(String path) {
        OutputFormat format = OutputFormat.createPrettyPrint();
        format.setEncoding("UTF-8");// 指定XML编码
        try {
            XMLWriter writer = new XMLWriter(new FileWriter(path), format);
            writer.write(document);
            writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void showPhoneInfo() {
        // 获取XML的根节点
        Element root = document.getRootElement();
        // 遍历所有的Brand标签
        for (Iterator itBrand = root.elementIterator(); itBrand.hasNext(); ) {
            Element brand = (Element) itBrand.next();
            // 输出标签的name属性
            System.out.println("品牌:" + brand.attributeValue("name"));
            // 遍历Type标签
            for (Iterator itType = brand.elementIterator(); itType.hasNext(); ) {
                Element type = (Element) itType.next();
                // 输出标签的name属性
                System.out.println("\t型号:" + type.attributeValue("name"));
            }
        }
    }

    public void addNewPhoneInfo() {
        // 获取XML的根节点
        Element root = document.getRootElement();
        // 创建Brand标签
        Element element = root.addElement("Brand");
        // 给Brand标签设置属性
        element.addAttribute("name", "三星");
        // 创建Type标签
        Element typeElement = element.addElement("Type");
        // 给Type标签设置属性
        typeElement.addAttribute("name", "Note4");
        saveXML(url);
    }

    public void updatePhoneInfo() {
        // 获取XML的根节点
        Element root = document.getRootElement();
        int id = 0;
        for (Iterator itBrand = root.elementIterator(); itBrand.hasNext(); ) {
            Element brand = (Element) itBrand.next();
            if (brand.attributeValue("name").equals("华为")) {
                brand.getParent().remove(brand);
            }
        }
        saveXML(url);
    }

    public void deleteItem() {
        // 获取XML的根节点
        Element root = document.getRootElement();
        int id = 0;
        for (Iterator itBrand = root.elementIterator(); itBrand.hasNext(); ) {
            Element brand = (Element) itBrand.next();
            if (brand.attributeValue("name").equals("华为")) {
                brand.getParent().remove(brand);
            }
        }
        saveXML(url);
    }
    
    public static void main(String[] args) {
        loadDocument();
        //	showPhoneInfo();
        addNewPhoneInfo();
        //	saveXML("新收藏.xml");
        //	updatePhoneInfo();
        //	deleteItem();
        showPhoneInfo();
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Glensea

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值