博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAXP使用Stax API时格式化输出XML 2
阅读量:6964 次
发布时间:2019-06-27

本文共 3205 字,大约阅读时间需要 10 分钟。

之前实现的一个版本:

这个版本中存一个问题:如果某一个节点的值是空的话,会换行输出结束标签,如:

<a>

</a>

某些场景下会要求节点内必须要有值,否则就应该输出为 <a/>(例如XBRL instance的schemaLink节点)。

 

新代码如下:

XMLPrettyFormatter:

1 import javax.xml.stream.XMLStreamException; 2  3 /** 4  * XML pretty formatter. 5  */ 6 public interface XMLPrettyFormatter { 7  8     enum NodeType { 9         ELEMENT, VALUE, NULL10     }11 12     String DEFAULT_INDENTION = "\t";13 14     void writeStartElementIndention() throws XMLStreamException;15 16     /**17      * @param blankValue18      *            True if the value is null of blank character.19      */20     void writeValueIndention(boolean blankValue) throws XMLStreamException;21 22     void writeEndElementIndention() throws XMLStreamException;23 24 }

DefaultPrettyFormatter:

1 import java.util.LinkedList; 2  3 import javax.xml.stream.XMLStreamException; 4  5 import org.codehaus.stax2.XMLStreamWriter2; 6  7 /** 8  * Default XML pretty formatter. 9  * 
    10 *
  1. Default intention is tab character "\t".
  2. 11 *
  3. The value display in the same line with which element it belongs to.
  4. 12 *
  5. If value is blank, don't use separate end tag.
  6. 13 *
14 */15 public class DefaultPrettyFormatter implements XMLPrettyFormatter {16 17 private String indent = DEFAULT_INDENTION;18 19 private LinkedList
stack = new LinkedList
();20 21 private XMLStreamWriter2 writer;22 23 public DefaultPrettyFormatter(XMLStreamWriter2 writer) {24 this.writer = writer;25 }26 27 public DefaultPrettyFormatter(XMLStreamWriter2 writer, String indent) {28 this.writer = writer;29 this.indent = indent;30 }31 32 @Override33 public void writeStartElementIndention() throws XMLStreamException {34 NodeType lastNode = stack.peek();35 if (lastNode != null && lastNode == NodeType.NULL) {36 stack.pop();37 }38 39 writeLineBreaker();40 for (int i = 0; i < stack.size(); ++i) {41 writeIndention();42 }43 44 stack.push(NodeType.ELEMENT);45 46 // default value node47 stack.push(NodeType.NULL);48 }49 50 @Override51 public void writeValueIndention(boolean blankValue) throws XMLStreamException {52 if (!blankValue) {53 // if value is not blank, pop default blank node first.54 stack.pop();55 stack.push(NodeType.VALUE);56 }57 }58 59 @Override60 public void writeEndElementIndention() throws XMLStreamException {61 NodeType lastNode = stack.pop();62 if (lastNode == NodeType.ELEMENT) {63 writeLineBreaker();64 for (int i = 0; i < stack.size(); ++i) {65 writeIndention();66 }67 } else {68 // pop start element69 stack.pop();70 }71 }72 73 private void writeLineBreaker() throws XMLStreamException {74 writer.writeCharacters("\n");75 }76 77 private void writeIndention() throws XMLStreamException {78 writer.writeCharacters(indent.toCharArray(), 0, indent.length());79 }80 81 }

 

转载于:https://www.cnblogs.com/lyhtbc/p/3673192.html

你可能感兴趣的文章
苹果笔记本只有电源键能用的解决办法
查看>>
Android在Gallery中每次滑动只显示一页
查看>>
OpenCV 脸部跟踪(1)
查看>>
Table嵌套去掉子table的外边框
查看>>
解决Sqlite UTF-8中文数据格式在DOS窗口下中文乱码
查看>>
paip.http 404错误 的解决
查看>>
使用maven+eclipse搭建最简单的struts2的HelloWorld
查看>>
C#图片处理示例(裁剪,缩放,清晰度,水印)
查看>>
Replication--镜像+复制
查看>>
vb.net与c#相互转换工具
查看>>
.NET应用架构设计—面向查询服务的参数化查询设计(分解业务点,单独配置各自的数据查询契约)...
查看>>
Dubbo实现RPC调用使用入门
查看>>
php 回收周期(Collecting Cycles)
查看>>
表单的几个基本常用功能
查看>>
[Voice communications] 让音乐响起来
查看>>
[Voice communications] 看得到的音频流
查看>>
可变参数
查看>>
使用mii-tool设置网卡速率
查看>>
Windows 8 应用开发 - 本地数据存储
查看>>
十二步创建你的第一个JavaScript库
查看>>