gpt4 book ai didi

java - 为什么 Java 中的 XML Dom 会报告额外的节点?

转载 作者:行者123 更新时间:2023-11-29 10:06:52 24 4
gpt4 key购买 nike

我有一个表的简单 XML 表示形式。当我只遍历顶层时,使用代码(包含在下面)。我得到 5 个节点,而实际上在提供的示例中只有 2 个(theader 和 tbody)。有人可以解释为什么吗?

package testparser;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Vector;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class TestParser {
private static final int FILE_small = 1;
private static final int FILE_medium = 2;
private static final int FILE_large = 3;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
doDomTest(1);

}
private static void doDomTest(int sizeId) {
String filename = getFileNameFromId(sizeId);

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
FileInputStream fis = new FileInputStream(filename);
Document doc = db.parse(fis);

Element topElement = doc.getDocumentElement();

NodeList nl = topElement.getChildNodes();

int ilen = nl.getLength();
print("Top Element count " + ilen);
for (int i=0;i<ilen;i++){
Node node = nl.item(i);
if (node.getNodeType()==Node.TEXT_NODE) {
print(i + ". Name:" + node.getNodeName() + "= " + node.getNodeValue() + ". type " + node.getNodeType());
} else {
print(i + ". Name:" + node.getNodeName() + ", type " + node.getNodeType());
}
}


} catch (Exception e) {
e.printStackTrace();
}

}


private static String getFileNameFromId(int sizeId) {
String sReturn = "";
switch (sizeId) {
case FILE_small:
sReturn = "D:/temp/testdata_ok.xml";
break;
case FILE_medium:
sReturn = "D:/temp/testdata_ok.xml";
break;
case FILE_large:
sReturn = "D:/temp/testdata_ok.xml";
break;
}
return sReturn;
}

private static void print(String sValue) {
System.out.println(sValue);
}
}

测试数据

<?xml version="1.0" encoding="utf-8"?>
<table>
<theader>
<tr>
<th>Title Col1</th>
<th>Title Col2</th>
<th>Title Col3</th>
<th>Title Col4</th>
</tr>
</theader>
<tbody>
<tr>
<td>data:R1C1</td>
<td>data:R1C2</td>
<td>data:R1C3</td>
<td>data:R1C4</td>
</tr>
<tr>
<td>data:R2C1</td>
<td>data:R2C2</td>
<td>data:R2C3</td>
<td>data:R2C4</td>
</tr>
<tr>
<td>data:R3C1</td>
<td>data:R3C2</td>
<td>data:R3C3</td>
<td>data:R3C4</td>
</tr>
<tr>
<td>data:R4C1</td>
<td>data:R4C2</td>
<td>data:R4C3</td>
<td>data:R4C4</td>
</tr>
<tr>
<td>data:R5C1</td>
<td>data:R5C2</td>
<td>data:R5C3</td>
<td>data:R5C4</td>
</tr>
</tbody>
</table>

控制台输出

Top Element count 5
0. Name:#text=
. type 3
1. Name:theader, type 1
2. Name:#text=
. type 3
3. Name:tbody, type 1
4. Name:#text=
. type 3

注意 theader 和 tbody(第 1 行和第 3 行)是如何在输出中报告的,但我也有项目 0,2 和 4。为什么要有额外的节点?我本来希望分别为 theader 和 tbody 列出 0 和 1 的行。

“type 1”/“type 3”表示“getNodeType()”方法的值也打印在输出中。我发现 getNodeType() 意思是 here .

我正在使用 JDK 1.6.0u24

最佳答案

三个额外的节点是代表空白的文本节点:

  • <table> 之间和 <theader>
  • </theader> 之间和 <tbody> , 和
  • </tbody> 之间和 </table> .

我不确定,但我认为你可以通过调用来消除节点

    dbf.setIgnoringElementContentWhitespace(true);

阅读the javadoc ,注意说明解析器必须处于验证模式的位 ...

关于java - 为什么 Java 中的 XML Dom 会报告额外的节点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5562854/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com