Как удалить все выбранные узлы из 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 ответов
Я не понимаю, почему возвращаемые узлы nodelist возвращают null для parentNode ().
но вы можете попробовать сначала выбрать все родители узлов, которые вы хотите удалить, с помощью этого выражения XPath:
"/list/member/friendlist[friend[.='0003']]"
или эквивалент,
"/list/member/friendlist[friend = '0003']]"
затем повторите полученный список узлов и в контексте каждого из них запросите узлы, соответствующие выражению XPath
"friend[.='0003']"
это даст вам родительский узел и дочерний узел для использования с removeChild()
.