zl程序教程

您现在的位置是:首页 >  其它

当前栏目

XStream双下划线问题解决与CDATA标记同时的方案

解决 方案 同时 标记 下划线 问题 XStream cdata
2023-09-14 08:57:15 时间
stream.alias("xml", unifiedOrder.getClass()); String xml = stream.toXML(unifiedOrder); System.out.println(xml);

输出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之间的转换。