DOM解析java将文本也视为结点
2009-10-31 17:53
393 查看
如题,虽然我开始以为我懂了,原来是不够细心。
所谓“文本”包括回车、空格任何字符,不要忽略啊!
比较无奈是,DOM树转成xml文件时,不会自动换行、缩进,为了格式美观,用
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT,"yes");
允许输出DOM树时添加空格。而正因此,解析xml文件时,就多出很多回车、空格组成的“文本结点”了,搞得我郁闷了好半天,想原理也想不通,最后在CSDN发帖才解决的。
下面是原帖:
情况:
用DOM解析一XML文件,其中有用到XPath求值器
在解析中获取结点时,出现这种情况:明明应该得到的是DOCUMENT_NODE类型的结点,但是得到的是TEXT_NODE
.xml文件结构:
<?xml version="1.0" encoding="GB2312"?>
<category>
<pattern>你是</pattern>
<template>
<random>
<li>你猜看 </li>
<li>不告诉你 </li>
</random>
</template>
</category>
JAVA代码:
Document document = getDocument();
Node rootNode = document.getFirstChild();
NodeList nodeCategorys = XPathAPI.selectNodeList(rootNode, "//category");
for (int i = 0; i < nodeCategorys.getLength(); i++){
if (nodeCategorys.item(i).hasChildNodes()){
Node template = XPathAPI.selectSingleNode(nodeCategorys.item(i), "template");
//【1】这行如果写成template.getFirstChild(),则templateChild就是TEXT_NODE类型
Node templateChild = template.getFirstChild().getNextSibling();
if (templateChild.getNodeName().equals("srai")) { continue; }
if (templateChild.getNodeName().equals("random")){
ItemVo vo = new ItemVo();
Node patternNode = nodeCategorys.item(i).getFirstChild().getNextSibling();//这行问题同【1】
String pattern = patternNode.getFirstChild().getNodeValue();//【2】
……
……
NodeList nodeLi = XPathAPI.selectNodeList(templateChild,"li");
for (int j = 0; j < nodeLi.getLength(); j++)
{
Node liNode = nodeLi.item(j);//【3】这里又不用加getNextSibling()了,取出的是DOCUMENT_NODE类型
String li = liNode.getFirstChild().getNodeValue();
}
……
……
关于DOM将文本也视为一个结点这个我知道,所以在【2】的地方用getFirstChild().getNodeValue()才取到 <patter>标签的文本值。
但是【1】【3】两处出现的问题我就很不理解了,为什么一会要加getNextSibling()一会又不加,而且感觉原理上不对啊?
解答:
在DOM中,其实Template有三个直接子节点:
1。 文本节点(回车换行空格等, 在 <template> 和 <random>之间);
2。元素节点(random);
3。文本节点(回车换行空格在 </random>和 </template>之间),所以template.getFirstChild()返回的是文本节点。
所谓“文本”包括回车、空格任何字符,不要忽略啊!
比较无奈是,DOM树转成xml文件时,不会自动换行、缩进,为了格式美观,用
TransformerFactory tff=TransformerFactory.newInstance();
Transformer tf=tff.newTransformer();
tf.setOutputProperty(OutputKeys.INDENT,"yes");
允许输出DOM树时添加空格。而正因此,解析xml文件时,就多出很多回车、空格组成的“文本结点”了,搞得我郁闷了好半天,想原理也想不通,最后在CSDN发帖才解决的。
下面是原帖:
情况:
用DOM解析一XML文件,其中有用到XPath求值器
在解析中获取结点时,出现这种情况:明明应该得到的是DOCUMENT_NODE类型的结点,但是得到的是TEXT_NODE
.xml文件结构:
<?xml version="1.0" encoding="GB2312"?>
<category>
<pattern>你是</pattern>
<template>
<random>
<li>你猜看 </li>
<li>不告诉你 </li>
</random>
</template>
</category>
JAVA代码:
Document document = getDocument();
Node rootNode = document.getFirstChild();
NodeList nodeCategorys = XPathAPI.selectNodeList(rootNode, "//category");
for (int i = 0; i < nodeCategorys.getLength(); i++){
if (nodeCategorys.item(i).hasChildNodes()){
Node template = XPathAPI.selectSingleNode(nodeCategorys.item(i), "template");
//【1】这行如果写成template.getFirstChild(),则templateChild就是TEXT_NODE类型
Node templateChild = template.getFirstChild().getNextSibling();
if (templateChild.getNodeName().equals("srai")) { continue; }
if (templateChild.getNodeName().equals("random")){
ItemVo vo = new ItemVo();
Node patternNode = nodeCategorys.item(i).getFirstChild().getNextSibling();//这行问题同【1】
String pattern = patternNode.getFirstChild().getNodeValue();//【2】
……
……
NodeList nodeLi = XPathAPI.selectNodeList(templateChild,"li");
for (int j = 0; j < nodeLi.getLength(); j++)
{
Node liNode = nodeLi.item(j);//【3】这里又不用加getNextSibling()了,取出的是DOCUMENT_NODE类型
String li = liNode.getFirstChild().getNodeValue();
}
……
……
关于DOM将文本也视为一个结点这个我知道,所以在【2】的地方用getFirstChild().getNodeValue()才取到 <patter>标签的文本值。
但是【1】【3】两处出现的问题我就很不理解了,为什么一会要加getNextSibling()一会又不加,而且感觉原理上不对啊?
解答:
在DOM中,其实Template有三个直接子节点:
1。 文本节点(回车换行空格等, 在 <template> 和 <random>之间);
2。元素节点(random);
3。文本节点(回车换行空格在 </random>和 </template>之间),所以template.getFirstChild()返回的是文本节点。
相关文章推荐
- java Dom 解析xml文档,实现xml文档结点的增删改查,遍历
- JAVA解析XML的方式DOM、SAX、DOM4J、JDOM、StAX之比较
- Java 解析 xml 之 DOM and SAX
- Java解析xml——DOM、SAX、JDOM和DOM4J四种方式的汇总与比较
- java解析xml的方式DOM,SAX,DOM4J,JDOM,StAX
- Java解析XML文档——dom解析xml
- java中的dom,XmlPullParser 解析xml,
- java学习笔记——使用DOM解析XML和使用SAX解析XML
- org.w3c.dom(java dom)解析XML文档
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java XML解析之DOM解析
- Java解析XML汇总(DOM/SAX/JDOM/DOM4j/XPath)
- Java Dom解析xml
- POPTEST老李分享DOM解析XML之java
- XML解析方法DOM(Java)
- java解析json文本,去除//后和/**/中的内容
- Java读取Excel并解析文本(并格式化输出)
- JAVA DOM生成和解析XML实例
- javaXML解析的俩种方法-----DOM-----SAX
- java 解析 文本