java进阶开发-----XML、XML解析

(一)、XML入门(可扩展标记语言)
一种数据表示格式,可以用于自定义数据格式。
作用:用于进行存储数据和传输数据或作为软件的配置文件
1.XML语法与标签(元素)规则

//语法
<?xml version="1.0" encoding="UTF-8" ?>
version:XML默认的版本号码、该属性是必须存在的
encoding:本XML文件的编码


2.XML标签(元素)规则

  • 标签由一对尖括号和合法标识符组成<name></name>必须存在一个根标签有且只能有一个。 标签必须成对出现,有开始,有结束: <name></name>
  • 特殊的标签可以不成对,但是必须有结束标记,如:<br/>
  • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来<student id = “1”></name>

3.存在的特殊字符(正常使用会与标签信息有冲突)

  • &lt;    <  小于
  • &gt;    >  大于
  • &amp;  &  和号
  • &apos;  '  单引号
  • &quot;  "  引号

也可以用CDATA区: <![CDATA[   …内容…  ]]>//不会有冲突

<?xml version="1.0" encoding="UTF-8" ?>
<!--根标签有且只能有一个-->
<student>
    <name>美波</name>
    <sex>女</sex>
    <hobby>内脏</hobby>
    <info>
        <age>22</age>
        <addr>日本</addr>
    </info>
    <sql>
        select * from user where age &lt; 18;
        select * from user where age &lt; 18 &amp;&amp; age > 10;
        <![CDATA[<!--直接写不用转-->
            select * from user where age > 18;
        ]]>
    </sql>
</student>

4.文档约束
用来限定xml文件中的标签以及属性应该怎么写,以此强制约束程序员必须按照文档约束的规定来编写xml文件。
 
XML文档约束-DTD的使用(了解)

  • 编写DTD约束文档,后缀必须是.dtd
  • 在需要编写的XML文件中导入该DTD约束文档
  • 按照约束的规定编写XML文件的内容

//data1.dtd 文件
<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
//xml文件实现
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data1.dtd">//申明
<书架>//写入此字段后面就直接生成
        <书>
                 <书名>dadad</书名>
                <作者>dada</作者>
                <售价>add</售价><!--不能指定数据类型-->
        </书>
</书架>

XML文档约束方式二-schema约束(了解)//能约束数据类型

(二)、XML的解析
使用程序读取XML中的数据
两种解析方法

  • SAX解析(一段一段的解析)
  • DOM解析(全部一次性解析,大文件也好解析)//首选解析工具:dom4j

Document对象:整个xml文档
{Element对象:标签;Attribute对象:属性;Text对象:文本内容} ==> Node对象
1.使用Dom4J解析出XML文件

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.InputStream;

//使用dom4j解析XML文件
public class Dom4jHelloWorldDemo1 {
    @Test
    public void parseXMLData() throws Exception{
        //创建Dom4j的解析器,代表整个dom4j框架
        SAXReader saxReader = new SAXReader();
        //把XML文件加载到内存成为一个Document文档对象
        //Document document = (Document) saxReader.read(new File("xml-app\\src\\Contacts.xml"));//需要通过模块名定位
        InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);//直接去src下寻找文件
        //获取根元素对象
        Element root = document.getRootElement();
        System.out.println(root.getName());
    }
}

2.Dom4J解析XML文件中的各种节点

//xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<contactList>
    <contact id = "1" vip = "true">
        <name> 美波 </name>
        <gander>女</gander>
        <email>bobo@itcast.cn</email>
    </contact>
    <contact id = "2" vip = "false">
        <name> 小栗旬 </name>
        <gander>男</gander>
        <email>xunxun@itcast.cn</email>
    </contact>
    <contact id = "1" vip = "false">
        <name> 胰脏 </name>
        <gander>女</gander>
        <email>yiyi@itcast.cn</email>
    </contact>
    <user>
    </user>
</contactList>

//Dom4j解析元素、属性、文本
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.io.InputStream;
import java.util.List;

//使用dom4j解析XML文件
public class Dom4jHelloWorldDemo1 {
    @Test
    public void parseXMLData() throws Exception{
        //创建Dom4j的解析器,代表整个dom4j框架
        SAXReader saxReader = new SAXReader();
        //把XML文件加载到内存成为一个Document文档对象
        //Document document = (Document) saxReader.read(new File("xml-app\\src\\Contacts.xml"));//需要通过模块名定位
        InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);//直接去src下寻找文件
        //获取根元素对象
        Element root = document.getRootElement();
        System.out.println(root.getName());
        //拿根元素下的全部子元素对象
        //List<Element> sonEles = root.elements();//根拿子
        List<Element> sonEles = root.elements("contact");//拿某个子元素
        for (Element sonEle : sonEles) {
            System.out.println(sonEle.getName());
        }
        //拿某个子元素
        Element userEle = root.element("user");
        System.out.println(userEle.getName());
        //默认提取第一个子元素对象
        Element contact = root.element("contact");
        //获取子元素文本
        System.out.println(contact.elementText("name"));
        //去掉前后空格
        System.out.println(contact.elementTextTrim("name"));
        //根据元素获取属性值
        Attribute idAttr = contact.attribute("id");
        System.out.println(idAttr.getName() + "-->" + idAttr.getValue());
        //直接提取属性值
        System.out.println(contact.attributeValue("id"));
        System.out.println(contact.attributeValue("vip"));
        //获取当前元素下的子元素对象
        Element email = contact.element("email");
        System.out.println(email.getText());

    }
}

 3.Dom4j解析案例

//已创建Contect对象,之后解析
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;

public class Dom4JTest2 {
    //解析XML中的数据成为一个List集合对象
    @Test
    public void parseToList() throws Exception{
        //导入框架
        //创建SaxReader对象
        SAXReader saxReader = new SAXReader();
        //加载XML文件成为文档Document对象
        Document document = saxReader.read(Dom4JTest2.class.getResourceAsStream("/Contacts.xml"));
        //先拿根元素
        Element root = document.getRootElement();
        //提取contact子元素
        List<Element> contactEles = root.elements("contact");
        //准备一个ArrayList集合封装联系人信息
        List<Contact> contacts = new ArrayList<>();
        //遍历Contact子元素
        for (Element contactEle : contactEles) {
            //每个子元素都是一个联系人对象
            Contact contact = new Contact();
            contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
            contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
            contact.setName(contactEle.elementTextTrim("name"));
            contact.setGendar(contactEle.elementTextTrim("gender").charAt(0));
            contact.setEmail(contactEle.elementText("email"));
            contacts.add(contact);
        }
        //遍历List集合
        for (Contact contact : contacts) {
            System.out.println(contact);
        }
    }
}
//运行结果
Contact{name='美波', id=1, vip=true, gendar=女, email='bobo@itcast.cn'}
Contact{name='小栗旬', id=2, vip=false, gendar=男, email='xunxun@itcast.cn'}
Contact{name='胰脏', id=1, vip=false, gendar=女, email='yiyi@itcast.cn'}

4.使用Xpath检索出XML文件

public class XPathDemo {
    //绝对路径:/根元素/子元素/孙元素;//相对路径:./子元素/孙元素(不能跨级)
    @Test
    public void parse02() throws Exception{
        SAXReader saxReader = new SAXReader();
        //把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contact2.xml"));
        //检索全部名称
        List<Node> nameNode = document.selectNodes("/contactList/contact/name");
        for (Node node : nameNode) {
            Element nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }
    //元素 再全文找这个元素
    //元素1/元素2 在全文找元素1下面的一级元素2
    //元素1//元素2 在全文找元素1下面的全部元素2
    public void parse03() throws Exception{
        SAXReader saxReader = new SAXReader();
        //把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contact2.xml"));
        //检查数据
        //List<Node> nameNodes = document.selectNodes("//name");
        List<Node> nameNodes = document.selectNodes("//contact/name");
        for (Node nameNode : nameNodes) {
            Element nameEle = (Element) nameNode;
            System.out.println(nameEle.getTextTrim());
        }
    }
    //@属性名称 在全文检索属性对象
    //元素【@属性名称】 在全文检索包含该属性的元素对象
    //元素【@属性名称=值】 在全文检索包含该属性的元素且属性值为该值的元素对象
    public void parse04() throws Exception{
        SAXReader saxReader = new SAXReader();
        //把XML加载成Document文档对象
        Document document =
                saxReader.read(XPathDemo.class.getResourceAsStream("/Contact2.xml"));
        //检索全部名称
        List<Node> nides = document.selectNodes("//@id");
        for (Node node1 : nides) {
            Attribute attr = (Attribute) node1;
            System.out.println(attr.getName() + "==>" + attr.getValue());
        }
        //查询name元素(包含id属性的)
        //Node node = document.selectSingleNode("//name[@id]");
        Node node = document.selectSingleNode("//name[@id=1]");
        Element ele = (Element) node;
        System.out.println(ele.getTextTrim());
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 中,可以使用 Apache XML-RPC 库来解析 XML-RPC 返回的 XML 数据。 1. 解析 XML-RPC 返回的 XML 数据 可以通过以下代码来解析 XML-RPC 返回的 XML 数据: ``` XmlRpcStreamResponseConfig respConfig = new XmlRpcStreamResponseConfig(); XmlRpcStreamResponse resp = new XmlRpcStreamResponse(respConfig); InputStream is = ... // 从网络或文件中读取返回的 XML 数据 resp.parse(is); XmlRpcValue value = resp.getReturnValue(); ``` 其中,respConfig 是返回配置对象,is 是返回的 XML 数据的输入流,value 是解析后的返回值。 需要注意的是,在解析 XML-RPC 返回的 XML 数据时,需要使用 XmlRpcStreamResponse 对象,而不是 XmlRpcStreamRequest 对象。 2. 获取 XML-RPC 返回值 可以通过以下代码来获取 XML-RPC 返回值: ``` if (value.getType() == XmlRpcValue.TYPE_STRUCT) { Map<String, Object> struct = new HashMap<String, Object>(); XmlRpcStruct rpcStruct = (XmlRpcStruct) value; for (String key : rpcStruct.keySet()) { struct.put(key, rpcStruct.get(key).getValue()); } // 处理结构体类型的返回值 } else if (value.getType() == XmlRpcValue.TYPE_ARRAY) { List<Object> list = new ArrayList<Object>(); XmlRpcArray rpcArray = (XmlRpcArray) value; for (int i = 0; i < rpcArray.size(); i++) { list.add(rpcArray.get(i).getValue()); } // 处理数组类型的返回值 } else { Object result = value.getValue(); // 处理其他类型的返回值 } ``` 其中,value 是返回值,通过 getType() 方法可以获取返回值的类型,如果是结构体类型,则可以通过 XmlRpcStruct 对象获取结构体中的键值对;如果是数组类型,则可以通过 XmlRpcArray 对象获取数组中的元素;否则,直接通过 getValue() 方法获取返回值。 以上就是 Java 解析 XML-RPC 返回的 XML 数据的基本步骤。通过 Apache XML-RPC 库,可以方便地进行 XML-RPC 返回数据的解析和处理。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

符气满满

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

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

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

打赏作者

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

抵扣说明:

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

余额充值