相关文章推荐
英姿勃勃的地瓜  ·  Qt ...·  1 年前    · 
眉毛粗的风衣  ·  VBA to save Excel ...·  1 年前    · 

我们在对接接口的时候,可能接口返回的是xml格式的字符串,那么这时候我们就需要对xml格式的字符串进行解析来获取结果,同时有时候我们请求接口的入参也需要是xml格式的字符串,这都需要我们对xml字符串进行处理,下面我们就来看看解析xml的常用方法。

XML字符串

下面就是我遇到的一个接口的返回值,是一个很典型的XML格式字符串,我们就以它为例进行解析

<?xml version="1.0" encoding="utf-8"?>
<responsedata>
  <resultcode>xxx</resultcode>
  <resultdesc>xxx</resultdesc>
</responsedata>

一、用DOM4J解析xml字符串

DOM4J是dom4j.org出品的一个开源XML解析包,Dom4j是一个易用的、开源的库,用于XML,XPath和XSLT。它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP。

DOM4J是我们常用的xml处理工具,下面我们就来说说如何使用它

1、添加依赖

 		<!--解析xml报文-->
        <dependency>
            <groupId>dom4j</groupId>
            <artifactId>dom4j</artifactId>
            <version>1.6.1</version>
        </dependency>

2、解析字符串

下面就是一个解析字符串的实例,大家可以参考:

  public static void main(String[] args) throws Exception {
        //将给定的String文本解析为XML文档并返回新创建的document
        org.dom4j.Document document = DocumentHelper.parseText(xmlString);
        //获取根节点,在例子中就是responsedata节点
        Element rootElement = document.getRootElement();
        //获取根节点下的某个元素
        Element resultcode = rootElement.element("resultcode");
        Element resultdesc = rootElement.element("resultdesc");
        //getData返回元素的数据
        String resultcodeData = (String) resultcode.getData();
        String data = (String) resultdesc.getData();
        //遍历所有子节点
        for (Iterator i = rootElement.elementIterator(); i.hasNext(); ){
            Element  next = (Element) i.next();
            System.out.println(next.getName()+":"+next.getData());
        //遍历某个子节点,如resultcode
        for (Iterator i = rootElement.elementIterator("resultcode"); i.hasNext(); ){
            Element  next = (Element) i.next();
            System.out.println(next.getName()+":"+next.getData());

DOM4J解析xml字符串流程:

1、使用parseText方法将xml字符串转换成Document对象
2、获取Root节点,XML解析都是从Root元素开始的
3、使用element方法直接获取某个子节点或者使用elementIterator迭代器进行遍历

除了使用字符串,我们还可以使用xml文件来生成document对象

//读取XML文件,获得document对象.  
SAXReader reader = new SAXReader();
org.dom4j.Document   document = reader.read(new File("input.xml"));

DOM4J生成xml格式的字符串

我们除了可以使用Dom4j解析xml格式字符串之外,我们还可以使用Domj来生成xml格式的字符串,这在我们构造XML格式的请求参数的时候是非常有用的。

<?xml version="1.0" encoding="UTF-8"?>
<requestData>
  <username>xxx</username>
   <password>yyy</password>
</requestData>

比如我们想生成上面的xml字符串,那么可以使用以下方法

* 生成xml格式的字符串 * @return public static String createXmlString(){ //创建document对象 org.dom4j.Document document = DocumentHelper.createDocument(); //设置编码 document.setXMLEncoding("UTF-8"); //创建根节点 Element requestData = document.addElement("requestData"); //在根节点加入username子节点 Element username = requestData.addElement("username"); //往子节点添加内容 username.setText("xxx"); //加入password子节点 Element password = requestData.addElement("password"); //添加内容 password.setText("yyy"); //将document对象转换成字符串 String xml = document.asXML(); System.out.println(xml); return xml;
<?xml version="1.0" encoding="UTF-8"?>
<requestData><username>xxx</username><password>yyy</password></requestData>
//通过这句定义一个XML文档对象
Document document = DocumentHelper.createDocument();
//通过这句定义一个XML元素,这里添加的是根节点
Element requestData = document.addElement("requestData ");

Element有几个重要的方法:

addComment:添加注释
addAttribute:添加属性
addElement:添加子元素
setText:设置节点的内容

注:setText和addAttribute是不一样的效果

username.addAttribute("username","xxx");

生成的格式如下:

<username username="xxx"/>

addAttribute是在节点添加一个属性,而不是添加节点内容,这要注意

二、使用JDK的org.w3c.dom.Document解析xml字符串

方法一需要我们添加依赖,如果想不添加依赖,我们可以直接使用JDK的org.w3c.dom.Document进行解析

下面我就使用org.w3c.dom.Document来解析下开头的xml字符串

实例如下:

* 使用org.w3c.dom.Document来解析xml字符串 public static void parseXmlString() throws ParserConfigurationException, IOException, SAXException { //创建DOM解析器的工厂实例 DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); //从DOM工厂中获取解析器 DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //使用解析器生成Document实例 Document document = documentBuilder.parse(new InputSource(new StringReader(xmlString))); //获取responsedata元素的节点列表 NodeList responsedata = document.getElementsByTagName("responsedata"); //遍历该节点列表 for (int i=0; i< responsedata.getLength();i++){ //获取具体的元素 org.w3c.dom.Element node = (org.w3c.dom.Element) responsedata.item(i); //输出值 System.out.println("resultcode:"+node.getElementsByTagName("resultcode").item(0).getFirstChild().getNodeValue()); System.out.println("resultdesc:"+node.getElementsByTagName("resultdesc").item(0).getFirstChild().getNodeValue());

注意:DOM解析的数据是保留在内存中的,这方便我们修改,但同时如果xml文件比较大的时候,占用的内存也会较大,可能会造成内存溢出

org.w3c.dom.Document生成xml字符串

* 使用org.w3c.dom.Document来生成xml字符串 public static String createXmlStr(){ String xmlString = ""; DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); try { DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder(); //使用解析器生成Document实例 Document document = documentBuilder.newDocument(); //设置版本号 document.setXmlVersion("1.0"); //创建父元素 org.w3c.dom.Element requesData = document.createElement("requesData"); //创建子元素 org.w3c.dom.Element username = document.createElement("username"); //添加元素内容 username.setTextContent("xxx"); org.w3c.dom.Element password = document.createElement("password"); password.setTextContent("yyy"); //将子元素添加到父元素 requesData.appendChild(username); requesData.appendChild(password); //将父元素添加到Document document.appendChild(requesData); //创建转换器实例 TransformerFactory transFactory = TransformerFactory.newInstance(); Transformer transformer = transFactory.newTransformer(); //设置输出的编码 transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); //是否可以在输出结果树时添加额外的空格 transformer.setOutputProperty(OutputKeys.INDENT, "yes"); // xml转换String DOMSource domSource = new DOMSource(document); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); transformer.transform(domSource,new StreamResult(byteArrayOutputStream)); xmlString=byteArrayOutputStream.toString(); }catch (Exception e){ log.error("出现异常:"+e); return ""; System.out.println(xmlString); return xmlString;
<?xml version="1.0" encoding="UTF-8"?>
<requesData>
   <username>xxx</username>
   <password>yyy</password>
</requesData>

org.w3c.dom的接口说明

在这里插入图片描述
更多API,大家可以查看以下网站

https://www.apiref.com/java11-zh/java.xml/org/w3c/dom/package-summary.html

目录前言XML字符串一、用DOM4J解析xml字符串DOM4J生成xml格式的字符串二、使用JDK的org.w3c.dom.Document解析xml字符串org.w3c.dom.Document生成xml字符串org.w3c.dom的接口说明前言我们在对接接口的时候,可能接口返回的是xml格式的字符串,那么这时候我们就需要对xml格式的字符串进行解析来获取结果,同时有时候我们请求接口的入参也需要是xml格式的字符串,这都需要我们对xml字符串进行处理,下面我们就来看看解析xml的常用方法。XML字符
在网上找了很多Java语言解析XML字符串的资料,很多内容写得很繁复,没有普适性,遂自己动手写了一个用Java解析XML的工具类。话不多说,直接看下面代码: XML解析工具类: import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Node; import org.dom4j.io.SAXReader; import java.io.ByteArrayInputStream; import java.
0" encoding="GB2312"?><RESULT><VALUE> <NO>A1234</NO> <ADDR>四川省XX县XX镇XX路X段XX号</ADDR></VALUE><VALUE> <NO>B1234</NO> <ADDR>四川省XX市XX乡XX...
AirTrioa: “基于临时顺序节点方案”,这个有一个问题,就是如果 多线程同时争抢zk锁的话,currentPath、beforePath 作为实例属性,会被不同的线程更新掉:导致 同一个节点的多个线程会watch 到同一个 beforePath,造成死锁。 正确的方式是,currentPath、beforePath 设置为 ThreadLocal ,确保同一个节点的不同线程 属性隔离。。。[code=java] * 当前 Lock 路径 private final ThreadLocal<String> currentLockPath = new ThreadLocal<>(); * 前一个节点 Lock 路径 private final ThreadLocal<String> beforeLockPath = new ThreadLocal<>(); [/code]