简单JavaDOM解析的问题

简单JavaDOM解析的问题,java,dom,Java,Dom,有人能解释一下为什么会这样吗。我通过创建一个简单的程序简化了我的问题,但请参阅我面临的问题的详细信息: String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<title text=\"title1\">\n" + " <comment id=\"comment1\">\n" + " <data> abcd </data>\n" + "

有人能解释一下为什么会这样吗。我通过创建一个简单的程序简化了我的问题,但请参阅我面临的问题的详细信息:

String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<title text=\"title1\">\n" +
"    <comment id=\"comment1\">\n" +
"        <data> abcd </data>\n" +
"        <data> efgh </data>\n" +
"    </comment>\n" +
"    <comment id=\"comment2\">\n" +
"        <data> ijkl </data>\n" +
"        <data> mnop </data>\n" +
"        <data> qrst </data>\n" +
"    </comment>\n" +
"</title>\n";

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = builder.parse(new InputSource(new StringReader(xml)));

System.out.println(doc.getFirstChild().getNodeName());
System.out.println(doc.getFirstChild().getFirstChild().getNodeName());
首先,为什么我不能获取
注释
节点

其次,为什么
数据
节点被解释为
文本
节点

获取所需节点的正确且简单的方法是什么。还请注意,XML文件不是固定的;我想要一个任意的解决方案。谢谢

编辑:

我在使用Xpath时遇到了类似的问题,请参见下面的代码:

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/title/comment/data/text()");
NodeList result = (NodeList) expr.evaluate(msg.document(), XPathConstants.NODESET);
for(int i = 0; i < result.getLength(); i++)
    System.out.println(result.item(i).getNodeName() + " : " + result.item(i).getNodeValue());

title
节点的第一个节点是文本节点,包含
\n
元素开始前的四个空格

要获取注释节点,请向其父节点询问其第二个节点,或通过标记名“comment”询问其第一个元素。您还可以在child中循环并返回类型为
ELEMENT\u node
的第一个节点


是包含文本节点的元素节点。文本节点的值为“abcd”。

@JB Nizet对发生的情况的解释是正确的


一种可能的解决方法是通过调用
DocumentBuilderFactory
将解析器配置为忽略“可忽略的空白”。我知道这将导致解析无法为标记之间的空白生成那些不需要的文本节点。

AFAIK这仅在“验证模式”下有效,因此必须提供一些DTD/XML模式定义(“此设置要求解析器处于验证模式”)。谢谢,我添加了一些用于Xpath的其他代码。仍然无法理解为什么无法获取
数据
节点。我希望这是一个节点,其中nodename是数据,textcontent是“abcd”。我理解错了吗?您要求的是…/data/text(),因此它返回文本。请求…/数据,它将返回数据元素。每个返回的数据元素都将有一个子元素,这将是一个文本节点。。。同样,对于每个数据元素,我可以调用
.getTextContent()
,它还返回内部文本节点值
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expr = xpath.compile("/title/comment/data/text()");
NodeList result = (NodeList) expr.evaluate(msg.document(), XPathConstants.NODESET);
for(int i = 0; i < result.getLength(); i++)
    System.out.println(result.item(i).getNodeName() + " : " + result.item(i).getNodeValue());
#text :  abcd 
#text :  efgh 
#text :  ijkl 
#text :  mnop 
#text :  qrst