Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中使用XPathExpression删除XML文件中文本内容==var1和属性==var2的父节点的节点?_Java_Xml_Xpath - Fatal编程技术网

如何在Java中使用XPathExpression删除XML文件中文本内容==var1和属性==var2的父节点的节点?

如何在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

我有一个xml文件,其格式如下:

<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工作

因此,我的问题是:

  • 如何修复我的XPathExpression以指向我想要的songId节点,其中playlist属性和songId文本内容都是变量
  • 如何仅删除XPathExpression指向的songId节点

  • 要选择
    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)