Как удалить все выбранные узлы из XPath? - PullRequest
7 голосов
/ 01 июня 2011

Я запускаю 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 работает, выбирая все «дружественные» узлы, которые имеют значение = 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();
}

объект документа XML, для которого проанализирован файл XML.XML работает нормально.Только XML не возвращает ссылку, а целый новый список узлов, что делает невозможным возвращение к исходному XML-документу для внесения изменений.

Ответы [ 3 ]

10 голосов
/ 01 июня 2011

для каждого узла в возвращенном NodeList:

n.getParentNode().removeChild(n);
3 голосов
/ 01 июня 2011

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

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

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

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

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

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

"friend[.='0003']"

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

1 голос
/ 01 июня 2011

Посмотрите на XUpdate . Это не красиво, но работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...