XStream双下划线问题解决与CDATA标记同时的方案
解决 方案 同时 标记 下划线 问题 XStream cdata
2023-09-14 08:57:15 时间
stream.alias("xml", unifiedOrder.getClass());
String xml = stream.toXML(unifiedOrder);
System.out.println(xml);
public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { // 对所有xml节点的转换都增加CDATA标记 boolean cdata = true; @Override @SuppressWarnings("rawtypes") public void startNode(String name, Class clazz) { super.startNode(name, clazz); @Override protected void writeText(QuickWriter writer, String text) { if (cdata) { writer.write(" ![CDATA["); writer.write(text); writer.write("]] "); } else { writer.write(text); });
stream.alias("xml", unifiedOrder.getClass()); String xml = stream.toXML(unifiedOrder);
public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { // 对所有xml节点的转换都增加CDATA标记 boolean cdata = true; @Override @SuppressWarnings("rawtypes") public void startNode(String name, Class clazz) { super.startNode(name, clazz); @Override public String encodeNode(String name) { return name;
fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。
输出XML为:
public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { // 对所有xml节点的转换都增加CDATA标记 boolean cdata = true; @Override @SuppressWarnings("rawtypes") public void startNode(String name, Class clazz) { super.startNode(name, clazz); @Override protected void writeText(QuickWriter writer, String text) { if (cdata) { writer.write(" ![CDATA["); writer.write(text); writer.write("]] "); } else { writer.write(text); });
输出XML为:
stream.alias("xml", unifiedOrder.getClass()); String xml = stream.toXML(unifiedOrder);
输出XML:
经过测试,XmlFriendlyNameCoder与XppDriver不能同时存在。so,问题来了。如何才能让两者共存呢。
双下划线问题的产生是因为XStream默认的转换方式中定义了对特殊字符的转换,代码如下:
//XmlFriendlyNameCoder.encodeName(String name) for (; i length; i++ ) { char c = name.charAt(i); if (c == $ || c == _ || c = 27 || c = 127) { break; }
也就是说,我们在转换的过程中,不对特殊字符进行转换就可以了。
XppDriver类中有对字符转换的方法:
/** * Encode the node name into the name of the target format. * @param name the original name * @return the name in the target format * @since 1.4 public String encodeNode(String name) { return nameCoder.encodeNode(name); }
这里可以看到,XppDriver的encodeNode是把节点的名称进行格式化。然后调用nameCoder对象对名字进行编译。
我们在XppDriver的子类中,重写此方法,不再像XppDriver那样调用nameCoder来进行编译,而是直接返回节点名称。
public HierarchicalStreamWriter createWriter(Writer out) { return new PrettyPrintWriter(out) { // 对所有xml节点的转换都增加CDATA标记 boolean cdata = true; @Override @SuppressWarnings("rawtypes") public void startNode(String name, Class clazz) { super.startNode(name, clazz); @Override public String encodeNode(String name) { return name;
fastJson对于json格式字符串的解析主要用到了一下三个类: JSON:fastJson的解析器,用于JSON格式字符串与JSON对象及javaBean之间的转换。
相关文章
- 解决跨域问题 has been blocked by CORS policy: No ‘Access-Control-Allow-Origin‘ header is present[通俗易懂]
- laravel 微信公众号的Token无效解决的方案[通俗易懂]
- nodejs 解决sql注入方案
- cocosCreator解决Chrome浏览器跨域问题
- 解决Linux EINTR问题的最优方案(linuxeintr)
- 处理解决Redis中Java键值对过期处理方案(redisjava过期)
- Linux后门入侵检测工具,附bash漏洞最终解决方法
- MSSQL错误:解决9003错误的正确方案(mssql 错误9003)
- 解决MySQL中的1111错误问题(mysql中1111错误)
- 解决缓存问题无Redis可行方案(不用redis怎么做缓存)
- 解决Oracle数据库中临时表使用方案(oracle临时表方案)
- 解决Redis雪崩的有效设置方案(redis雪崩设置)
- 解决 Redis 集群挂掉的有效方案(redis集群挂掉后方案)
- 解决方案解决Oracle SID占用的有效方案(oracle sid占用)
- Oracle OGG方案解决一致性问题的有力利器(oracle ogg方案)
- 在android中增加curl的解决方法
- php5.4以下版本json不支持不转义内容中文的解决方法