2014-02-17 3 views
3

У меня есть структура XML следующим образом:Удалить узел с помощью XPath

<a> 
    <b> 
     <foo>null</foo> 
    </b> 
    <b> 
     <foo>abc</foo> 
    </b> 
    <b> 
     <foo>efg</foo> 
    </b> 
</a> 

Я использую org.w3c.dom.Document для обновления узлов. когда <foo> имеет значение null, я хочу, чтобы удалить

<b> 
    <foo>null</foo> 
</b> 

Возможно ли это? Я знаю, что могу позвонить removeChild(childElement), но не знаю, как я могу указать удаление указанного вложенного элемента выше.

Обновление: С ниже ответ, я попробовал:

String query = "https://stackoverflow.com/a/b[foo[text() = 'null']]"; 
Object result = (xpath.compile(newQuery)).evaluate(doc, NODE); 
NodeList nodes = (NodeList)result; 
for (int i = 0; i < nodes.getLength(); i++) 
{ 
    Node node = nodes.item(i); 
    doc.removeChild(node); 
} 

я NOT_FOUND_ERR: An attempt is made to reference a node in a context where it does not exist.

+0

возможно дубликат [Удаление узла из файла XML в Java] (http://stackoverflow.com/questions/19925255/delete-a-node-from -xml-file-in-java) –

ответ

5
doc.removeChild(node); 

не будет работать, потому что узел вы пытаетесь удалить, не является дочерним узлом документа, это ребенок из элемент документа (a), который сам является дочерним элементом корневого узла документа. Вы должны вызвать removeChild на правильном родительском узле:

node.getParentNode().removeChild(node); 
+0

Мне было глупо не замечать этого! Благодарю. – rgamber

3

Чтобы получить этот узел можно использовать XPath:

/a/b[foo[text() = 'null']] 
+0

Да, я могу это сделать. Но если я назову removeChild на этом, он удалит только ' нуль', или ' null'. Также я не хочу касаться корневого узла ''. – rgamber

+0

В соответствии с вопросом тура вы хотите удалить ' null ', справа? –

+0

да. Я думал, что этот запрос также попытается удалить/изменить '' – rgamber

Смежные вопросы