如何在Java中使用XPathExpression删除XML文件中文本内容==var1和属性==var2的父节点的节点?
我有一个xml文件,其格式如下:如何在Java中使用XPathExpression删除XML文件中文本内容==var1和属性==var2的父节点的节点?,java,xml,xpath,Java,Xml,Xpath,我有一个xml文件,其格式如下: <library> <playlists> <playlist id="0"> <songs> <songId>2</songId> <songId>5</songId> </songs> </pla
<library>
<playlists>
<playlist id="0">
<songs>
<songId>2</songId>
<songId>5</songId>
</songs>
</playlist>
<playlist id="1">
<songs>
<songId>1</songId>
<songId>5</songId>
<songId>8</songId>
</songs>
</playlist>
</playlists>
</library>
这会导致NullPointerException,因为XPathExpression中有错误
我还怀疑该行:
deleteSongNode.getParentNode().removeChild(deleteSongNode);
将删除
<songs>
<songId>1</songId>
<songId>4</songId>
</songs>
1.
4.
不仅是我要删除的songId节点,而且我还无法测试它,因为我还没有让XPathExpression工作
因此,我的问题是:
要选择
songId
元素,它必须是主步骤表达式中的最后一个元素。我在这里使用
引用当前上下文元素,但对于这种特殊情况,text()
返回直接子文本节点也应该起作用。另一方面,XPath字符串中的单引号看起来比转义的双引号要整洁一些,IMO:
String query = "/library/playlists/playlist[@id='" + selectedPlayListId + "']/songs/songId[. = '" + selectedSongId + "']";
XPathExpression expr = xpath.compile(query);
此外,如果songId
是唯一的,则可以对节点的XPath求值,而不是对节点集求值,以便一次只返回一个节点:
Node songId = (Node) expression.evaluate(document, XPathConstants.NODE);
songId.getParentNode().removeChild(songId)
Node songId = (Node) expression.evaluate(document, XPathConstants.NODE);
songId.getParentNode().removeChild(songId)