我正在修改旧版代码,并且如果其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
}
}
}
}
答案 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()