今天在公司碰到了个问题,用Dom4J写XML出问题。。看了这个帖子后果断解决了,,mark一下。。再次谢谢原作者:http://lavasoft.blog.51cto.com/62575/347348
Dom4j格式化转义字符问题
1、不得不说的XML CDATA部件
在XML文档中的所有文本都会被解析器解析。
只有在CDATA部件之内的文本会被解析器忽略。
不合法的XML字符必须被替换为相应的实体。
如果在XML文档中使用类似"<" 的字符, 那么解析器将会出现错误,因为解析器会认为这是一个新元素的开始。
< | < | 小于号 |
> | > | 大于号 |
& | & | 和 |
' | ' | 单引号 |
" | " | 双引号 |
实体必须以符号"&"开头,以符号";"结尾。
注意: 只有"<" 字符和"&"字符对于XML来说是严格禁止使用的。剩下的都是合法的,为了减少出错,使用实体是一个好习惯。
CDATA部件
在CDATA内部的所有内容都会被解析器忽略。
如果文本包含了很多的"<"字符和"&"字符——就象程序代码一样,那么最好把他们都放到CDATA部件中。
一个 CDATA 部件以"<![CDATA[" 标记开始,以"]]>"标记结束:
CDATA注意事项:
CDATA部件之间不能再包含CDATA部件(不能嵌套)。如果CDATA部件包含了字符"]]>" 或者"<![CDATA[" ,将很有可能出错哦。
同样要注意在字符串"]]>"之间没有空格或者换行符。
2、Dom4j格式化转义字符问题
person.xml
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name>张三</name>
<addr><![CDATA[经三路<鑫苑>19F]]></addr>
</person>
<person>
<name>张三</name>
<addr><![CDATA[经三路<鑫苑>19F]]></addr>
</person>
上面的XML在被Dom4j格式化的时候,自动会被转义,转义后的内容如下:
<?xml version="1.0" encoding="GBK"?>
<person>
<toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>
<toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>
这样,显然不是想要的结果,因为CDATA不需要再转义了。如何处理该问题,看下面的程序的处理:
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2010-7-10 16:03:39
*/
public class Person {
private String name;
private String addr;
public Person(String name, String addr) {
this.name = name;
this.addr = addr;
}
public static void main(String[] args) {
Person p = new Person("张三", "经三路<鑫苑>19F");
p.showXml();
}
public void showXml() {
String xml1, xml2, xml3;
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding("GBK");
Element root = doc.addElement("person");
if (addr != null)
addElement(root, "toname", "<![CDATA[" + this.addr + "]]>");
else
addElement(root, "toname", this.addr);
xml1 = doc.asXML(); //默认转义
xml2 = formatXml(doc, "GBK", true); //转义
xml3 = formatXml(doc, "GBK", false); //不转义
System.out.println(xml1);
System.out.println("-------------------------");
System.out.println(xml2);
System.out.println("-------------------------");
System.out.println(xml3);
}
/**
* 在指定的元素下添加一个新的子元素
*
* @param e 父元素
* @param name 子元素名
* @param value 子元素值
* @return 新加子元素
*/
public static Element addElement(Element e, String name, Object value) {
Element x = e.addElement(name);
if (value == null || "".equals(value.toString().trim())) {
x.setText("");
} else if (value instanceof Date) {
x.setText(DateToolkit.toISOFormat((Date) value));
} else {
x.setText(value.toString());
}
return x;
}
/**
* 格式化XML文档
*
* @param document xml文档
* @param charset 字符串的编码
* @param istrans 是否对属性和元素值进行转移
* @return 格式化后XML字符串
*/
public static String formatXml(Document document, String charset, boolean istrans) {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(charset);
StringWriter sw = new StringWriter();
XMLWriter xw = new XMLWriter(sw, format);
xw.setEscapeText(istrans);
try {
xw.write(document);
xw.flush();
xw.close();
} catch (IOException e) {
System.out.println("格式化XML文档发生异常,请检查!");
e.printStackTrace();
}
return sw.toString();
}
}
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import java.io.IOException;
import java.io.StringWriter;
import java.util.Date;
/**
* Created by IntelliJ IDEA.
*
* @author leizhimin 2010-7-10 16:03:39
*/
public class Person {
private String name;
private String addr;
public Person(String name, String addr) {
this.name = name;
this.addr = addr;
}
public static void main(String[] args) {
Person p = new Person("张三", "经三路<鑫苑>19F");
p.showXml();
}
public void showXml() {
String xml1, xml2, xml3;
Document doc = DocumentHelper.createDocument();
doc.setXMLEncoding("GBK");
Element root = doc.addElement("person");
if (addr != null)
addElement(root, "toname", "<![CDATA[" + this.addr + "]]>");
else
addElement(root, "toname", this.addr);
xml1 = doc.asXML(); //默认转义
xml2 = formatXml(doc, "GBK", true); //转义
xml3 = formatXml(doc, "GBK", false); //不转义
System.out.println(xml1);
System.out.println("-------------------------");
System.out.println(xml2);
System.out.println("-------------------------");
System.out.println(xml3);
}
/**
* 在指定的元素下添加一个新的子元素
*
* @param e 父元素
* @param name 子元素名
* @param value 子元素值
* @return 新加子元素
*/
public static Element addElement(Element e, String name, Object value) {
Element x = e.addElement(name);
if (value == null || "".equals(value.toString().trim())) {
x.setText("");
} else if (value instanceof Date) {
x.setText(DateToolkit.toISOFormat((Date) value));
} else {
x.setText(value.toString());
}
return x;
}
/**
* 格式化XML文档
*
* @param document xml文档
* @param charset 字符串的编码
* @param istrans 是否对属性和元素值进行转移
* @return 格式化后XML字符串
*/
public static String formatXml(Document document, String charset, boolean istrans) {
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding(charset);
StringWriter sw = new StringWriter();
XMLWriter xw = new XMLWriter(sw, format);
xw.setEscapeText(istrans);
try {
xw.write(document);
xw.flush();
xw.close();
} catch (IOException e) {
System.out.println("格式化XML文档发生异常,请检查!");
e.printStackTrace();
}
return sw.toString();
}
}
输出结果:
<?xml version="1.0" encoding="GBK"?>
<person><toname><![CDATA[经三路<鑫苑>19F]]></toname></person>
-------------------------
<?xml version="1.0" encoding="GBK"?>
<person><toname><![CDATA[经三路<鑫苑>19F]]></toname></person>
-------------------------
<?xml version="1.0" encoding="GBK"?>
<person>
<toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>
<toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>
-------------------------
<?xml version="1.0" encoding="GBK"?>
<?xml version="1.0" encoding="GBK"?>
<person>
<toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>
<toname><![CDATA[经三路<鑫苑>19F]]></toname>
</person>
Process finished with exit code 0
可以看出,最后一种输出是真正想要的结果。
因此,要控制转义的问题,必须对XML重新格式化,格式化的时候,需要设置:
xw.setEscapeText(false);
相关推荐
通过上述介绍,我们可以清楚地了解到 Dom 4j 如何帮助我们格式化 XML 输出并设置输出字符集。正确使用这些方法不仅可以提高代码的可读性和维护性,还能确保输出的 XML 文档符合预期的格式要求。
#### 四、使用DOM4J修改XML文件 修改XML文件包括增加、删除或更新元素及属性。使用DOM4J进行这些操作非常直观。 ```java // 更新属性值 root.addAttribute("新属性名", "新属性值"); // 删除元素 root.remove...
- **XML数据的转换**:通过XPath和XSLT支持,DOM4J可以方便地实现XML数据的转换和格式化。 - **XML数据的验证**:利用DTD或Schema(XSD)验证XML数据的正确性,确保数据的有效性和一致性。 #### 五、总结 DOM4J是...
总的来说,通过DOMParser和递归遍历XML树,我们可以有效地格式化和高亮XML字符串。这种方法在调试、查看或展示XML数据时非常有用。记住,虽然大部分现代浏览器都支持DOMParser,但在旧版本的IE中可能需要寻找替代...
4. **处理特殊字符**:XML中的特殊字符(如"、"&")需要转义,格式化时要确保它们正确地被转义和展示。 5. **性能优化**:对于大型XML文件,格式化过程可能会消耗大量资源。因此,源码需要考虑性能优化,如使用流式...
5. **字符串输出**:编辑完成后,我们需要将富文本内容转化为格式化的字符串,这涉及到HTML实体的转义,以防止在非HTML环境中显示特殊字符。例如,`需要转换为`<`,`>`转换为`>`。此外,还可能需要去除不必要...
其次,处理特殊字符,如将"&"转义为"&",确保XML的合法性;最后,根据用户需求,可能还包括调整输出格式,比如控制缩进的空格数、是否保留空白等。 总的来说,这款XML格式化工具提供了方便快捷的方式对XML文档...
为了提高用户体验,通常会采用格式化输入的方式,将银行卡号每四位用特定的符号(如“-”)进行分隔,以方便用户阅读和输入。本文将详细介绍如何在Vue项目中实现银行卡号的格式化。 ### Vue项目中实现银行卡号格式...
4. **数据格式化**:为了使JSON易于阅读,工具可能使用了递归函数或者数组操作来添加缩进和换行,同时可能还实现了颜色编码以突出关键数据。 5. **前端交互**:除了后端PHP处理,前端JavaScript也可能被用来处理...
5. **转义字符处理**:RTF文档中的汉字等非ASCII字符通过转义字符序列表示。例如,“\'cb\'ce\'cc\'e5”表示汉字“宋体”。解析时需将这些转义字符转换为对应的字节序列,再使用相应的编码格式进行解码。 6. **关键...
用户可以通过这些编辑器输入格式化的文本,插入图片、表格甚至是多媒体元素,并在网页上展示这些内容。然而,这种灵活性也带来了潜在的安全风险,尤其是跨站脚本攻击(XSS)风险,因此,为了保证网页内容的安全性,...
- **特殊字符**:XML文档中可能存在特殊字符,如`、`>`、`&`等,这些在XML中具有特殊含义,需要正确转义。如果未正确处理,可能导致解析错误。 - **浏览器兼容性**:描述中提到的谷歌浏览器的XML解析问题可能是指...
在XML和Map的转换过程中,可能用到了如`dom4j`或`jaxb`等库,它们提供了方便的XML操作API。这些库可以通过Maven引入,添加到项目的pom.xml文件中。例如,`dom4j`的依赖可以这样写: ```xml <groupId>dom4j ...
- `rvalidescape`: 用于匹配JSON字符串中的转义字符的正则表达式。 - `rvalidtokens`: 用于匹配JSON字符串中的合法标记(如字符串、布尔值、数字等)的正则表达式。 #### 字符串转换 - `rmsPrefix`: 用于检测字符...
最后,文档中推荐了一些在线工具,这些工具可以用来检验、美化或格式化JSON数据,便于开发者更好地查看和调试JSON数据。在进行Web开发时,使用这些在线工具可以提高开发效率,避免在开发过程中出现JSON格式错误等...
这种语法非常适合构建格式化的XML字符串。 5. **输出XML字符串**:最后,通过`echo $aaa;` 将XML字符串输出到浏览器。 要生成更复杂的XML字符串,可以使用PHP的DOMDocument和DOMElement类,它们提供了更方便的方式...
当HTML字符串非常长时,应该注意代码的格式化问题。适当的换行和缩进能够帮助开发者更好地理解和维护代码。在拼接字符串时,应保持代码整洁,避免使用冗长的一行代码,这样有利于减少错误和提高代码的可读性。 4. ...
使用jQuery库来处理DOM操作和AJAX请求,而`JSONFormat.js`则是自定义的JavaScript代码,用于JSON格式化。这展示了在实际项目中,通常会结合使用成熟的库(如jQuery)和自定义脚本来实现特定需求。 通过上述方式,...