dom4j - 使用详解与xml-json转换

简介: dom4j - 使用详解与xml-json转换

关于dom4j简介就不再赘述了,通过dom4j可以很轻松从xml中获取内容或者将string转换为xml并输出为xml文档。

同样,你也可以根据需求将xml转换为客户端/前端需要的json形式。

maven依赖如下:

<!-- https://mvnrepository.com/artifact/org.dom4j/dom4j -->
    <dependency>
        <groupId>org.dom4j</groupId>
        <artifactId>dom4j</artifactId>
        <version>2.1.1</version>
    </dependency>

【1】获取Document的几种方式

获取SAXReader 实例。

SAXReader reader = new SAXReader();

① 读取XML文件,获得document对象

Document  document = reader.read(new File("foo.xml"));

根据saxReader的read重写方法可知,既可以通过file对象来读取,也可以通过inputStream输入流来读取。

Document document = saxReader.read(inputStream);

② 解析XML形式的文本,得到document对象.

String text = "<csdn>J080624</csdn>";              
Document document = DocumentHelper.parseText(text);  
// 如果出现异常,尝试使用如下方式
document = reader.read(new ByteArrayInputStream(text.getBytes("UTF-8")));

③ 主动创建document对象.

Document document = DocumentHelper.createDocument(); 
//创建根节点  
Element root = document.addElement("csdn");  

【2】节点对象的操作-Element

① 获取文档的根节点.

Element root = document.getRootElement();

② 获取某个节点的所有子节点

List elements = root.elements();

③ 取得某个节点的指定子节点.

Element element=node.element("四大名著");

④ 取得节点的文字

String text=node.getText();

⑤ 取得某节点下所有名为“csdn”的子节点,并进行遍历.

List nodes = rootElm.elements("csdn");   
for (Iterator it = nodes.iterator(); it.hasNext();) {     
    Element element = (Element) it.next();    
    // do something  
}  

⑥ 对某节点下的所有子节点进行遍历.

 for(Iterator it=root.elementIterator();it.hasNext();){        
        Element element = (Element) it.next();        
       // do something   
 }  

⑦ 在某节点下添加子节点

Element element = node.addElement("朝代");

⑧ 设置节点文字.

element.setText("明朝");

⑨ 删除某节点.

//childElement是待删除的节点,parentElement是其父节点  
parentElement.remove(childElment);  

⑩ 添加一个CDATA节点

Element contentElm = element.addElement("content");
contentElm.addCDATA("cdata区域");  

【3】节点对象的属性方法操作-Attribute

① 取得某节点下的某属性

Element root=document.getRootElement();        
//属性名
Attribute attribute=root.attribute("id");  

② 取得属性的文字

String text=attribute.getText();


④ 遍历某节点的所有属性

 Element root=document.getRootElement(); 
 for(Iterator it=root.attributeIterator();it.hasNext();){          
       Attribute attribute = (Attribute) it.next();           
       String text=attribute.getText();          
       System.out.println(text);    
  }
 List attributes = root.attributes();
 for(Attribute att:attributes ){
     String text=attribute.getText();          
     System.out.println(text);  
 }  

⑤ 设置某节点的属性和文字.

node.addAttribute("name", "sitinspring");

⑥ 设置属性的文字

  Attribute attribute=root.attribute("name");  
  attribute.setText("csdn");  

【4】将Document写入xml

① 文档中全为英文,不需设置编码

  XMLWriter writer = new XMLWriter(new  FileWriter("ot.xml"));   
  writer.write(document);    
  writer.flush();
  writer.close();  

② 文档中含有中文,设置编码格式

 OutputFormat format = OutputFormat.createPrettyPrint();
 // 创建文件输出的时候,自动缩进的格式                    
 format.setEncoding("UTF-8");//设置编码  
 XMLWriter writer = new XMLWriter(newFileWriter("output.xml"),format);  
 writer.write(document);  
 writer.flush();
 writer.close(); 

【5】String与XML转换

① 字符串转为xml

String xmlStr = "<xml><ERR>用户和密码校验错(密码不符)</ERR><E2><e1>e111</e1></E2></xml>";
//创建SAXReader对象  
SAXReader reader = new SAXReader();  
Document document = null;
ry {
  document = reader.read(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));
}catch (Exception e) {
  e.printStackTrace();
}

② xml转为字符串

 SAXReader reader = new SAXReader();  
 Document   document = reader.read(new File("csdn.xml"));              
 Element root=document.getRootElement();      
 String docXmlText=document.asXML();  
 String rootXmlText=root.asXML();  
 Element memberElm=root.element("csdn");  
 String memberXmlText=memberElm.asXML();  

【6】将指定xml-Str转为json

xmlStr如下:

String xmlStr = "<ERR>用户和密码校验错(密码不符)</ERR><E2><e1>e111</e1></E2>";

转为json方法如下:

  • 获取的json为一级json
public class XmlUtil {
  private static final Logger log = LoggerFactory.getLogger(XmlUtil.class);
  public static String transferXMLToJSON(String xmlStr){
    xmlStr = "<xmlRoot>"+xmlStr+"</xmlRoot>";
     //创建SAXReader对象  
        SAXReader reader = new SAXReader();  
        //读取文件 转换成Document  
        Document document = null;
    try {
      document = reader.read(new ByteArrayInputStream(xmlStr.getBytes("UTF-8")));
    }catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
        //获取根节点元素对象  
        Element node = document.getRootElement();  
        JSONObject jsonObject = new JSONObject();
        listNodes(node,jsonObject);
        log.debug("the xml-json : "+jsonObject.toJSONString());
        return jsonObject.toJSONString();
  }
  //遍历当前节点下的所有节点  
  public static void listNodes(Element node,JSONObject jsonObject){  
      log.debug("当前节点的名称:" + node.getName());  
      //首先获取当前节点的所有属性节点  
      List<Attribute> list = node.attributes();  
      //遍历属性节点  
      for(Attribute attribute : list){  
          log.debug("属性 "+attribute.getName() +":" + attribute.getValue());  
      }  
      //如果当前节点内容不为空,则输出  
//      if(!(node.getTextTrim().equals(""))){  
//           log.debug("子节点 "+node.getName() + ":" + node.getText());    
//           jsonObject.put(node.getName(),node.getText());
//      }  
      // 如果当前节点名字不为 "xmlRoot",则放入jsonObject
      if(!(node.getName().equals("xmlRoot"))){  
        log.debug("子节点 "+node.getName() + ":" + node.getText());    
        jsonObject.put(node.getName(),node.getText());
      }  
      //同时迭代当前节点下面的所有子节点  
      //使用递归  
      Iterator<Element> iterator = node.elementIterator();  
      while(iterator.hasNext()){  
          Element e = iterator.next();  
          listNodes(e,jsonObject);  
      }  
  }  
}


目录
相关文章
|
3月前
|
XML JavaScript Java
【JAVA XML 探秘】DOM、SAX、StAX:揭秘 Java 中 XML 解析技术的终极指南!
【8月更文挑战第25天】本文详细探讨了Java中三种主流的XML解析技术:DOM、SAX与StAX。DOM将XML文档转换为树状结构,便于全方位访问和修改;SAX采取事件驱动模式,适用于大型文件的顺序处理;StAX则兼具DOM和SAX的优点,支持流式处理和随机访问。文中提供了每种技术的示例代码,帮助读者理解如何在实际项目中应用这些解析方法。
159 1
|
4月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
所有 modern browsers 支持 W3C DOM 规范, 但仍存在差异, 主要是处理空白和换行的不同。例如, 在 XML 中, Internet Explorer 不会将空白或换行视为文本节点, 而其他浏览器则会。这会导致相同的 XML 文档在 IE 中的子节点数为 4, 而在其他浏览器中为 9:
|
4月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
所有 modern browsers 支持 W3C DOM, 但在处理空白和换行上存在差异。例如, 使用记事本编辑的 XML 可能包含 CR/LF 和额外空格。IE 不将空白视作文本节点, 与其他浏览器不同。
|
4月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
所有 modern browsers 支持 W3C DOM, 但在处理空白和换行上存在差异。例如, 使用记事本编辑的 XML 可能包含 CR/LF 和额外空格。IE 不将空白视作文本节点, 而其他浏览器则会。这会导致对相同 XML 文档的 `childNodes` 长度计算不同: IE 显示 4 个子节点, 其他浏览器显示 9 个。
|
4月前
|
XML Web App开发 JavaScript
XML DOM 解析器
Most browsers have a built-in XML parser that converts XML into a JavaScript accessible object (XML DOM).
|
4月前
|
XML 存储 JavaScript
XML DOM - 访问节点
通过 DOM, 可全面访问 XML 文档的节点。实现这一目标有 3 种方法: 1. 使用 `getElementsByTagName()` 方法, 2. 遍历节点树, 3. 利用节点间的关联进行导航。 `getElementsByTagName()` 返回一个 Node List, 即节点数组。
|
4月前
|
XML JavaScript 数据格式
XML DOM 浏览器差异
输出子节点的数量。结果取决于您所使用的浏览器。IE 浏览器会输出 4(提醒 4 个子节点),而其他浏览器会输出 9(提醒 9 个子节点)。
|
4月前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
遍历(Traverse)意味着在节点树中进行循环或移动。
|
4月前
|
XML Web App开发 JavaScript
XML DOM 解析器
解析器把 XML 转换为 JavaScript 可存取的对象(XML DOM)。
|
4月前
|
XML JavaScript 数据格式
XML DOM 遍历节点树
遍历(Traverse)意味着在节点树中进行循环或移动。