根据自己debug调试,我觉得对自带的DOM解析有三点需要注意
- DOM将回车(换行符)和节点内容(Value)都是作为节点来解析的。因此会导致一个节点如果没有内容或者节点里面直接是子节点的话也会有内容,不过是"\n"和"\t"组合成的。例:
<root>
</root>
或者
<root>
<a>sss</a>
</root>
在这种情况下会直接输出为:
<root>
</root>
或者
<root>
<a>
sss
</a>
</root>
- 因为第一点,DOM将节点进行了分类,主要是有两类:TEXT_NODE ,ELEMENT_NODE,通过对节点的类型判断,可以很好的解析和过滤所有的节点。
- DOM在获取TETX_NODE类型的节点的内容时,如果是回车(换行符),解析后的内容是由一个或多个的"\n","\t"组成的字符串,而内容(Value)节点解析后的则就是其值,不含"\n","\t"。
正确的例子代码如下:
public static void main(String[] args) throws SAXException, IOException, ParserConfigurationException{
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = docBuilder.parse(new File("books.xml"));
printXmlHeader(doc.getXmlVersion(), doc.getXmlEncoding());
printXml(doc.getDocumentElement(), 0);
}
/**
* 输出xml头
* @param version
* @param encode
*/
private static void printXmlHeader(String version, String encode){
System.out.println("<?xml version=\"" + version + "\" encoding=\"" + encode + "\">");
}
/**
* 输出xml的内容
* @param ele 为节点对象
* @param depth 为节点深度
*/
private static void printXml(Element ele, int depth){
//根据xml子节点的深度进行缩进
printTabWithXmlDepth(depth);
String tagName = ele.getTagName();
System.out.print("<" + tagName);
//输出属性
if(ele.hasAttributes()){
NamedNodeMap map = ele.getAttributes();
for(int index = 0; index < map.getLength(); index++){
Node node = map.item(index);
System.out.print(" " + node.getNodeName() + "=\"" + node.getNodeValue() + "\"");
}
}
System.out.println(">");
//输出该节点的子节点以及内容
if(ele.hasChildNodes()){
NodeList nodeList = ele.getChildNodes();
for(int index = 0; index <nodeList.getLength(); index++){
Node node = nodeList.item(index);
//判断该子节点是否也是一个节点
if(node.getNodeType() == Node.ELEMENT_NODE){
printXml((Element)node, depth+1);
}else if(node.getNodeType() == Node.TEXT_NODE){
String value = node.getNodeValue();
//DOM在获取TETX_NODE类型的节点的内容时,如果是回车(换行符),解析后的内容是由一个或多个的"\n","\t"组成的字符串,而内容(Value)节点解析后的则就是其值,不含"\n","\t"。
value = value.replaceAll("\n", "").replaceAll("\r", "").trim();
if(!"".equals(value)){
printTabWithXmlDepth(depth+1); //由于内容需要在当前节点的情况下进行缩进
//System.out.print(node.getParentNode().getNodeName() + "="); //输出当前node的名字
System.out.println(value);
}
}
}
}
//收尾,如</root>
printTabWithXmlDepth(depth);
System.out.println("</" +tagName + ">");
}
/**
* 缩进
* @param depth
*/
private static void printTabWithXmlDepth(int depth){
for(int i = 0; i < depth; i++){
System.out.print("\t");
}
}
输出结果如下:
<?xml version="1.0" encoding="UTF-8">
<root>
ssss
<books>
<book id="1" name="中国近现代史">
<author>
张三
</author>
<publisTime>
2010-9-20
</publisTime>
</book>
<book id="2" name="世界历史">
<author>
Rose
</author>
<publisTime>
2001-12-10
</publisTime>
</book>
</books>
</root>
分享到:
相关推荐
java读取xml文件 ,程序自带jar包在mylib下,加入工程即可,工程导入可用,更具自己需要读取xml文件生成所需文件。
通用性强,它会将XML文件的所有内容读取到内存中,然后使用DOM API遍历XML树、检索所需的数据; 优点:简单直观,但需要将文档读取到内存, 缺点:并不太适合移动设备; 2,SAX SAX是一个解析速度快并且占用内存少的...
Matlab使用JAVA虚拟机来处理XML文件,默认给出了三个用于处理XML的函数: l xmlread(), 用于读取XML文件内容,读入后的变量是一个Java XML object。 l xmlwrite(), 用于写入XML文件内容,同样输出变量也要是一个...
Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,...
Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称加密源程序代码实例,本例中使用RSA加密技术,...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
是一个Java的XML API,类似于jdom,用来读写XML文件的。Hibernate使用dom4j解析XML配置文件和XML映射元文件。必需的。 ehcache-1.2.jar Hibernate可以使用不同cache缓存工具作为二级缓存。EHCache是缺省的cache...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...
JCaptcha4Struts2 是一个 Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码...