Использовать JDOM для удаления элемента по его атрибуту? - PullRequest
1 голос
/ 19 декабря 2011

У меня есть XML-файл со следующей структурой:

<contacts>
    <contact id="0">
        <firstname />
        <lastname />
        <address>
            <street />
            <city />
            <state />
            <zip />
            <country />
        </address>
        <phone />
        <email />
        <continfo>
            <byemail />
            <byphone />
            <bymail />
        </continfo>
        <comments />
        <datecreated />
    </contact>
</contacts>

Используя JDOM, я хотел бы удалить весь контактный элемент и все его дочерние элементы, просмотрев атрибут id.Но у меня возникли проблемы с выяснением этого.Я пробовал следующее:

Element pageRoot = pageXML.getRootElement(); 

                    List<Element> contacts = new ArrayList<Element>(pageRoot.getChildren() ); 
                    Element contact = null;

                    for( Element element : contacts ){
                        String att = element.getAttributeValue("id"); 
                        if( Integer.parseInt(att) == id){
                            contact = (Element) element.clone(); 
                        }
                    }
pageRoot.removeContent(contact); 

Но этот контакт никогда не удаляется.Если бы кто-нибудь мог указать мне направление, это было бы здорово.Спасибо.

Ответы [ 2 ]

1 голос
/ 19 декабря 2011

Рекомендуется и (на мой взгляд, проще) использовать Iterator.remove() для удаления элементов. Вы можете сделать это, перебирая дочерние элементы, чтобы избежать сохранения элемента в дополнительной локальной переменной.

List children = root.getChildren("foo");
Iterator itr = children.iterator();
while (itr.hasNext()) {
  Element child = (Element) itr.next();
  String att = child.getAttributeValue("id"); 
  if( Integer.parseInt(att) == id){
    itr.remove();
  }
}

Этот пример адаптирован из JDOM faq

1 голос
/ 19 декабря 2011

Почему вы клонируете Элемент?

Вы можете просто удалить его напрямую:

if ( ... ){
    elementToRemove = (Element) element;
}
...
pageRoot.removeContent (elementToRemove);
...