Как удалить все выбранные узлы из XPath?

я запускаю XPath на Java со следующим xml и кодом:

<?xml version="1.0" encoding="UTF-8"?>
<list>
    <member name="James">
        <friendlist>
            <friend>0001</friend>
            <friend>0002</friend>
            <friend>0003</friend>
        </friendlist>
    </member>
    <member name="Jamie">
        <friendlist>
            <friend>0003</friend>
            <friend>0002</friend>
            <friend>0001</friend>
        </friendlist>
    </member>
    <member name="Katie">
        <friendlist>
            <friend>0001</friend>
            <friend>0003</friend>
            <friend>0004</friend>
        </friendlist>
    </member>
</list>

код:

try {
    XPath xpath = XPathFactory.newInstance().newXPath();
    XPathExpression pathExpr = xpath.compile("/list/member/friendlist/friend[.='0003']");
} catch (XPathExpressionException e) {

конечно, есть больше кодов после этого, но я не вставлял его здесь, потому что он думал, что это может запутать еще больше.

но идея в том, что я хочу выбрать все узлы друзей, которые имеют идентификатор 0003 из всех узлов списка друзей членов, а затем удалить его из XML-файла. XPath работает, выбирая все узлы "friend", которые имеют значение=0003. Я знайте, что я могу использовать метод removeChild () объекта XML-документа. Но проблема в том, как удалить все это напрямую, не проходя через слои циклов, начиная с его родителя? Метод removeChild () должен знать родителя своего родителя.

спасибо!

обновление: Вот как я использовал свой XPath:

XPath xpath = XPathFactory.newInstance().newXPath();
XPathExpression pathExpr = null;
try {
    pathExpr = xpath.compile("/list/member/friendlist/friend[.='0003']");
} catch (XPathExpressionException e) {
    e.printStackTrace();
}
NodeList list = null;
try {
    list = (NodeList) pathExpr.evaluate(xmlDoc, XPathConstants.NODESET);
} catch (XPathExpressionException e) {
    e.printStackTrace();
}

xmlDoc - это объект XML-документа с проанализированным XML-файлом. XML работает нормально. Это только XML, не возвращающий ссылку но совершенно новый nodelist, что делает невозможным для меня вернуться к исходному xml-документу для внесения поправок.

3 ответов


для каждого узла в возвращаемом списке узлов:

n.getParentNode().removeChild(n);

Я не понимаю, почему возвращаемые узлы nodelist возвращают null для parentNode ().

но вы можете попробовать сначала выбрать все родители узлов, которые вы хотите удалить, с помощью этого выражения XPath:

"/list/member/friendlist[friend[.='0003']]"

или эквивалент,

"/list/member/friendlist[friend = '0003']]"

затем повторите полученный список узлов и в контексте каждого из них запросите узлы, соответствующие выражению XPath

"friend[.='0003']"

это даст вам родительский узел и дочерний узел для использования с removeChild().


посмотреть XUpdate. Не очень красиво, но работает.