java-xml

XML

1.XML介绍

XML 可扩展标记语言(eXtensible Markup Language)没有预定义任何标签,需要自行定义标签

XML的特点   与操作系统 编程语言无关 可实现不同系统之间数据交换

XML作用      数据存储  数据交换 数据配置

2.XML和HTML的区别

XML 不是 HTML 的替代。

XML 和 HTML 为不同的目的而设计:

  • XML 被设计用来传输和存储数据,其焦点是数据的内容。
  • HTML 被设计用来显示数据,其焦点是数据的外观。

HTML 旨在显示信息,而 XML 旨在传输信息。

3.XML语法

                   

<标签名 属性名="属性值" 属性名="属性值" > 标签内容[空内容,其他标签,文本] </标签名>


元素的命名规则如下:
名称中可以包含字母、数字或者其他的字符
名称不能以数字或者标点符号开始
名称不能以字符“xml”(或者XML、Xml)开始
名称中不能含空格


属性的语法规则如下:
属性可以加在任何一个元素的起始标签上,但不能加在结束标签上
属性值用双引号包裹
一个元素可以有多个属性,多个属性之间用空格隔开
属性值中不能直接包含 <、"、&

特殊符号处理:
方式1: 特殊代码
< &lt;
> &gt;
" &quot;
' &apos;
& &amp;
方式2: 将内容声明普通文本
<description>
<![CDATA[ 讲解了元素<title>以及</title>的使用 ]]>
</description>

要求:
格式良好的XML文档需要遵循如下规则
1.有XML声明语句: <?xml version="1.0" encoding="UTF-8/[gb2312]"?>
2.有且仅有一个根元素: 根标签需要包裹整个文件内容.
3.标签大小写敏感: <A> <a> [HTML中,大小写不区分]
4.属性值用双引号/单引号: <a href="sdsds"></a> <a href='sdsds'></a>
5:标签成对/空标签关闭: 标签必须有开始和结束. <标签名/> 或 <标签名></标签名>
6.元素正确嵌套

      

4.XML解析四种方式

DOM

SAX

JDOM

DOM4j

5.DOM解析XML

 

<?xml version="1.0" encoding="utf-8" ?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"></Type>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"/>
        <Type name="iPhone ZL"/>
    </Brand>
</PhoneInfo>
public class TestDOM {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException {
        //1.DOM解析工厂实例
        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        //2.DOM解析器
        DocumentBuilder builder = factory.newDocumentBuilder();
        //3.构建DOM对象
        Document document = builder.parse("W:\StudyWorkSpace\TestXML\src\phone.xml ");

        //4.操作DOM对象 解析xml
        //getElementsByTagName() 指定名称下的所有标签
        //getLength() 标签的个数
        //item()   指定位置的标签
        //getAttribute() 指定属性值
        NodeList nodeList = document.getElementsByTagName("Brand");
        for (int i = 0; i < nodeList.getLength(); i++) {
            Element brand = (Element) nodeList.item(i);
            String name = brand.getAttribute("name");
            System.out.println("name = " + name );
            NodeList types = brand.getElementsByTagName("Type");
            for (int j = 0; j < types.getLength(); j++) {
               String typeName =((Element) types.item(j)).getAttribute("name");
                System.out.println("typeName = " + typeName);
            }
        }

    }
}

DOM CRUD XML文件

<?xml version="1.0" encoding="utf-8" ?>
<PhoneInfo>
    <Brand name="华为">
        <Type name="P90"></Type>
    </Brand>
    <Brand name="苹果">
        <Type name="iPhone Z"/>
        <Type name="iPhone ZL"/>
    </Brand>
</PhoneInfo>
ublic class TestNewCRUD {
    public static void main(String[] args) throws ParserConfigurationException, IOException, SAXException, TransformerException {
        //1.DOM解析工厂实例
        DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();

        //2.DOM解析器
        DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();

        //3.DOM对象
        Document document = documentBuilder.parse("W:\StudyWorkSpace\TestXML\src\newPhone.xml");

        //4.操作DOM对象  添加节点 修改节点 删除节点 保存xml
        //添加节点
        Element newBrand = document.createElement("Brand");
        newBrand.setAttribute("name","三星");

        Element newType = document.createElement("Type");
        newType.setAttribute("name","s111");

        //建立父子节点关系
        newBrand.appendChild(newType);

        //添加到整个文档对象中
        document.getElementsByTagName("PhoneInfo").item(0).appendChild(newBrand);


        //修改节点
        Element element = (Element) document.getElementsByTagName("Brand").item(2);
        element.setAttribute("name" ,"SAMSUNG");

        //删除节点
        Element elementDel = (Element) document.getElementsByTagName("Brand").item(2);
        //获得父节点在删除子节点
        Node parentNode = element.getParentNode();
        parentNode.removeChild(elementDel);


        //保存xml
        //创建DOM源 内存
        DOMSource domSource = new DOMSource(document);

        //创建流 写入磁盘
        StreamResult result = new StreamResult(new FileOutputStream("newPhone01.xml"));

        //设置文件格式
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        transformer.setOutputProperty(OutputKeys.VERSION,"1.0");
        transformer.setOutputProperty(OutputKeys.ENCODING,"UTF-8");
        transformer.setOutputProperty(OutputKeys.INDENT,"yes");
        transformer.setOutputProperty(OutputKeys.STANDALONE, "yes");

        transformer.transform(domSource,result);



    }
}

6.DOM4J解析XML


 

 
   
public class TestDOM4J {
    public static void main(String[] args) throws DocumentException, IOException {
        //1.创建SAXReader对象
        SAXReader reader = new SAXReader();

        //2.解析xml文件 获得Document对象
        Document document = reader.read(new File("W:\StudyWorkSpace\TestXML\src\newPhone.xml"));

        //DOM4J SAXReader 边读边解析  从根标签开始
        Element rootElement = document.getRootElement();
        //打印整个文件内容
        System.out.println(document.asXML());


        List<Element> list = rootElement.elements("Brand");
        //读取: 属性,文本
        List<Element> allBrand=rootElement.elements("Brand");
        for (Element element : allBrand) {
            //操作属性
            //element.attribute("name").getValue();
            String name=element.attributeValue("name");
            //操作子标签
            List<Element> typeList=element.elements("Type");
            for (Element typeE : typeList) {
                String typeName=typeE.attributeValue("name");
                System.out.println(name+"-"+typeName);
            }
        }

        //添加
        Element newBrand = rootElement.addElement("Brand");
        newBrand.addAttribute("name" ,"sanxing");
        Element newType = newBrand.addElement("Type");
        newType.addAttribute("name","yyyy");

        //修改
         newBrand.setAttributeValue("name","三星");

        //删除
        rootElement.remove(newBrand);

        //保存
        OutputFormat out = OutputFormat.createPrettyPrint();
        out.setEncoding("UTF-8");

        XMLWriter writer = new XMLWriter(new FileOutputStream("新手机.xml"), out);
        writer.write(document);
        writer.close();

    }
}


古人学问无遗力,少壮工夫老始成。 纸上得来终觉浅,绝知此事要躬行。
原文地址:https://www.cnblogs.com/wf-zhang/p/14164344.html