Java-如果属性包含在逗号分隔的字符串中,则删除所有元素

时间:2018-10-29 06:30:41

标签: java jdom

我正在修改旧版代码,并且如果其id属性包含在字符串中,则需要删除所有元素。

要删除的示例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>

编辑 这是我尝试过的,这是实际的代码。我也更新了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 :(得分:0)

由于未知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()的{​​{1}}方法获得的元素。如Element的{​​{3}}

中所述
  

这将返回一个直接嵌套在此元素内(一层深)的所有子元素的List,作为Element对象。如果此目标元素没有嵌套元素,则返回一个空的List。 返回的列表按文档顺序是“活动的”,对其的更改会影响元素的实际内容

     

最好使用Iterator遍历List,因为List.size()的底层实现可能不是最有效的。

因此,我们可以使用迭代器来迭代子元素,如果OfferID是我们的目标之一,则可以删除该元素。以下代码演示了如何完成此操作。

Element.getChildren()