JAXP使用Stax API时格式化输出XML 2
之前实现的一个版本:http://www.cnblogs.com/lyhtbc/p/jaxp-pretty-format-validate-validation-stax-stax2.html
这个版本中存一个问题:如果某一个节点的值是空的话,会换行输出结束标签,如:
<a>
</a>
某些场景下会要求节点内必须要有值,否则就应该输出为 <a/>(例如XBRL instance的schemaLink节点)。
新代码如下:
XMLPrettyFormatter:
import javax.xml.stream.XMLStreamException; /**
* XML pretty formatter.
*/
public interface XMLPrettyFormatter { enum NodeType {
ELEMENT, VALUE, NULL
} String DEFAULT_INDENTION = "\t"; void writeStartElementIndention() throws XMLStreamException; /**
* @param blankValue
* True if the value is null of blank character.
*/
void writeValueIndention(boolean blankValue) throws XMLStreamException; void writeEndElementIndention() throws XMLStreamException; }
DefaultPrettyFormatter:
import java.util.LinkedList; import javax.xml.stream.XMLStreamException; import org.codehaus.stax2.XMLStreamWriter2; /**
* Default XML pretty formatter.
* <ol>
* <li>Default intention is tab character "\t".</li>
* <li>The value display in the same line with which element it belongs to.</li>
* <li>If value is blank, don't use separate end tag.</li>
* </ol>
*/
public class DefaultPrettyFormatter implements XMLPrettyFormatter { private String indent = DEFAULT_INDENTION; private LinkedList<NodeType> stack = new LinkedList<XMLPrettyFormatter.NodeType>(); private XMLStreamWriter2 writer; public DefaultPrettyFormatter(XMLStreamWriter2 writer) {
this.writer = writer;
} public DefaultPrettyFormatter(XMLStreamWriter2 writer, String indent) {
this.writer = writer;
this.indent = indent;
} @Override
public void writeStartElementIndention() throws XMLStreamException {
NodeType lastNode = stack.peek();
if (lastNode != null && lastNode == NodeType.NULL) {
stack.pop();
} writeLineBreaker();
for (int i = 0; i < stack.size(); ++i) {
writeIndention();
} stack.push(NodeType.ELEMENT); // default value node
stack.push(NodeType.NULL);
} @Override
public void writeValueIndention(boolean blankValue) throws XMLStreamException {
if (!blankValue) {
// if value is not blank, pop default blank node first.
stack.pop();
stack.push(NodeType.VALUE);
}
} @Override
public void writeEndElementIndention() throws XMLStreamException {
NodeType lastNode = stack.pop();
if (lastNode == NodeType.ELEMENT) {
writeLineBreaker();
for (int i = 0; i < stack.size(); ++i) {
writeIndention();
}
} else {
// pop start element
stack.pop();
}
} private void writeLineBreaker() throws XMLStreamException {
writer.writeCharacters("\n");
} private void writeIndention() throws XMLStreamException {
writer.writeCharacters(indent.toCharArray(), 0, indent.length());
} }
JAXP使用Stax API时格式化输出XML 2的更多相关文章
- JAXP使用Stax API时格式化输出XML
最近项目中需要生成XBRL instance,对于XML读写和验证进行了一些学习.由于Stax API不支持格式化输出,默认全都写在一行上,网上也没有搜到现成的东西,自己写了一个格式化输出的帮助类. ...
- XStream、JAXB 日期(Date)、数字(Number)格式化输出xml
XStream.Jaxb是java中用于对象xml序列化/反序列化 的经典开源项目,利用它们将对象转换成xml时,经常会遇到日期(Date).数字按指定格式输出的需求,下面是使用示例: 一.日期字段格 ...
- boost格式化输出xml
我的boost为1.56而不是1.55 boost在xml的例子给出了一段写xml文件的代码,我简化如下: void debug_settings::save(const std::string &a ...
- .NET宝藏API之:OutputFormatter,格式化输出对象
相信大家在项目中都用过统一响应参数模板. 先声明一个响应模板类: public class ResponseDto { public int code { get; set; } public str ...
- Java数字格式化输出时前面补0
Java数字格式化输出时前面补0 星期日 2014年11月30日| 分类: Java /** * 里数字转字符串前面自动补0的实现. * */ public class TestString ...
- 格式化输出io:format的奇技淫巧
格式化输出io:format是我接触Erlang使用的第一个库函数(io:format("Hello World")),随着学习的深入,它也是我debug优先选择最简单直接的工具. ...
- 《ASP.NET Core跨平台开发从入门到实战》Web API自定义格式化protobuf
<ASP.NET Core跨平台开发从入门到实战>样章节 Web API自定义格式化protobuf. 样章 Protocol Buffers 是一种轻便高效的结构化数据存储格式,可以用于 ...
- WPF中任意Object的XAML代码格式化输出
原文:WPF中任意Object的XAML代码格式化输出 有时候,我们需要将WPF中的控件自身的XAML代码输出成文本,那么,我们可以使用System.Windows.Markup.XamlWriter ...
- cout 格式化输出
一直习惯于C语言的printf函数来打印,突然有一天要用cout来打印,发现有点不适应. 原来cout也是有格式化输出的. 首先要引入头文件 #include<iostream> // 在 ...
随机推荐
- IPFS星际节点网站 IPNS域名解析教程
IPNS星际文件系统IPFS提供的域名命名空间,相当于经典HTTP协议中的DNS.只不过是,IPNS是将内容寻址的哈希值(HASH值)转换为域名,而DNS是将IP地址转换为域名. 前段时间,IPFS协 ...
- [Pytorch]PyTorch Dataloader自定义数据读取
整理一下看到的自定义数据读取的方法,较好的有一下三篇文章, 其实自定义的方法就是把现有数据集的train和test分别用 含有图像路径与label的list返回就好了,所以需要根据数据集随机应变. 所 ...
- arm-linux-gcc安装使用教程
arm-linux-gcc如何下载安装2(转) [转]ubuntu下交叉编译环境构建(arm-linux-gcc-3.4.1.tar.bz2 ) 2009-03-03 10:05 1.下载arm-li ...
- lucene的分词器宝典
分词器概念介绍: Analyzer类(分词器)就是把一段文本中的词按某些规则取出,提供和以后查询时使用的工具类,注意在创建索引时会用到分词器,在使用字符串搜索时也会用到分词器,这两个地方要使用同一个分 ...
- angular 当使用ng-repeat 时出现 $$hashKey的键值对
小问题 把: ng-repeat="item in items " 改成 : ng-repeat="item in items track by $index"
- mac下cordova的ios-deploy安装问题
mac下进行cordova项目编译部署到ios设备,这个时候需要安装ios-deploy,会失败: npm WARN lifecycle ios-deploy@1.8.6~preinstall: ca ...
- Android程序的安装和打包
Android程序的安装和打包
- Les13 性能管理
目标 使用Oracle Enterprise Manager监视性能 使用自动内存管理(AMM) 使用内存指导调整内存缓冲区的大小 查看与性能相关的动态视图 排除无效和不可用对象产生的故障 性能监视 ...
- @DataProvider的应用
代码中经常有一些数据需要维护,但是每次都写在一个class或者methods中,维护起来是个麻烦事: 这里引入@DataProvider的思想,建一个DataProvider的方法,让我们需要维护的数 ...
- 使用Mysql Workbench 导入数据库提示 ERROR 1227 (42000) at line 18: Access denied; you need (at least one of) the SUPER privilege(s) for
今天再复制服务器上数据库的时候(使用Mysql Workbench )提示1227错误, 数据库版本5.7.18,复制到的数据库也是5.7.18. 总结一下网上的几种方法: 方法一: 最直观的翻译是说 ...