Java - удалить все элементы, если атрибут включен в разделенную запятыми строку - PullRequest
0 голосов
/ 29 октября 2018

Я изменяю устаревший код, и мне нужно удалить все элементы, если его атрибут id включен в строку.

Примеры идентификаторов для удаления:

String idToExclude = "2,4,6,8,10";

Предполагается, что Element doc содержит следующее:

<StoreOffers>
    <Store StoreID="0">
        <Offers>
            <Offer OfferID="1"/>
            <Offer OfferID="2"/>
            <Offer OfferID="3"/>
            <Offer OfferID="4"/>
            <Offer OfferID="5"/>
            <Offer OfferID="6"/>
            <Offer OfferID="7"/>
            <Offer OfferID="8"/>
            <Offer OfferID="9"/>
            <Offer OfferID="10"/>
        </Offers>
    </Store>
</StoreOffers>

EDIT Это то, что я пробовал, это фактический код. Я также обновил XML:

String offersToExclude = getOffersToExclude(customer);

                    StringReader asa = new StringReader(storeOffers);
                    SAXBuilder builder = new SAXBuilder();
                    Document doc = builder.build(asa);
                    Element root = doc.getRootElement();
                    List<Element> stores = root.getChildren();

                    for (Element store : stores) {
                        storeid = store.getAttributeValue("StoreID");
                        List<Element> offers = store.getChild("Offers").getChildren();

                        for(Element offer : offers) {
                            String offerid = offer.getAttributeValue("OfferID");

                            if(CCSUtils.isNotEmpty(offerid)) {
                                if(offersToExclude.contains(offerid)) {
                                    store.getChild("Offers").removeChild(offer); //This doesn't work
                                }
                            }
                        }
                    }

1 Ответ

0 голосов
/ 29 октября 2018

Поскольку версия jdom неизвестна, следующее решение основано на версии 2.0.6 (последняя на 29/10/2018).

Во-первых, метод removeChild не применим для аргумента String, есть только два метода: public boolean removeChild(final String cname) и public boolean removeChild(final String cname, final Namespace ns).

Чтобы добиться того, что вы ожидали, просто манипулируйте элементами, полученными из Element.getChildren() метода родительского Element. Как объяснено в Java Doc из Element.getChildren()

Возвращает список всех дочерних элементов, вложенных напрямую (на один уровень глубины) в этот элемент, как объекты Element. Если этот целевой элемент не имеет вложенных элементов, возвращается пустой список. Возвращенный список является «живым» в порядке документа, и изменения в нем влияют на фактическое содержимое элемента .

Последовательный обход по списку лучше всего выполнять с помощью итератора, поскольку базовая реализация List.size () может быть не самой эффективной.

Таким образом, мы можем использовать итератор для итерации дочерних элементов и удалить элемент, если OfferID является одной из наших целей. Следующий код демонстрирует, как это можно сделать.

import java.io.IOException;
import java.io.StringReader;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;
import org.jdom2.output.Format;
import org.jdom2.output.XMLOutputter;

public class DeleteChild {
    public static void main(String[] args) throws IOException, JDOMException {
        // Should not use String.contains method as OfferId="1" will be deleted.
        String[] offersToExclude = "2,4,6,8,10".split(",");

        StringReader stringReader = new StringReader(getXml());
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(stringReader);
        Element root = doc.getRootElement();
        System.out.println("*****Before Remove*****");
        System.out.println(new XMLOutputter(Format.getPrettyFormat(), null).outputString(root));
        List<Element> stores = root.getChildren();

        for (Element store : stores) {
            List<Element> offers = store.getChild("Offers").getChildren();
            Iterator<Element> offerIterator = offers.iterator();
            while (offerIterator.hasNext()) {
                Element offer = offerIterator.next();
                if (Arrays.asList(offersToExclude).contains(offer.getAttributeValue("OfferID"))) {
                    offerIterator.remove();
                }
            }
        }
        System.out.println("*****After Remove*****");
        System.out.println(new XMLOutputter(Format.getPrettyFormat(), null).outputString(root));
    }

    private static String getXml() {
        return "   <StoreOffers>                                          "
                + "    <Store StoreID=\"0\">                              "
                + "        <Offers>                                       "
                + "        <Offer OfferID=\"1\"/>                         "
                + "        <Offer OfferID=\"2\"/>                         "
                + "        <Offer OfferID=\"3\"/>                         "
                + "        <Offer OfferID=\"4\"/>                         "
                + "        <Offer OfferID=\"5\"/>                         "
                + "        <Offer OfferID=\"6\"/>                         "
                + "        <Offer OfferID=\"7\"/>                         "
                + "        <Offer OfferID=\"8\"/>                         "
                + "        <Offer OfferID=\"9\"/>                         "
                + "        <Offer OfferID=\"10\"/>                        "
                + "        </Offers>                                      "
                + "    </Store>                                           "
                + "</StoreOffers>                                         ";
    }
}
...