Предположение: атрибуты, которые вы хотите удалить из XmlObject
, должны быть необязательными в соответствующей XML-схеме. В этом предположении XMLBeans предоставляет вам пару полезных методов: unsetX
и isSetX
(где X
- имя вашего атрибута. Итак, мы можем реализовать метод removeAttributes
следующим образом:
public void removeAttributes(XmlObject obj,
String[] removeAttributeNames)
throws IllegalArgumentException, IllegalAccessException,
InvocationTargetException, SecurityException,
NoSuchMethodException {
Class<?> clazz = obj.getClass();
for (int i = 0; i < removeAttributeNames.length; i++) {
String attrName =
removeAttributeNames[i].substring(0, 1).toUpperCase() +
removeAttributeNames[i].substring(1);
String isSetMethodName = "isSet" + attrName;
Boolean isSet = null;
try {
Method isSetMethod = clazz.getMethod(isSetMethodName);
isSet = (Boolean) isSetMethod.invoke(obj, new Object[] {});
} catch (NoSuchMethodException e) {
System.out.println("attribute " + removeAttributeNames[i]
+ " is not optional");
}
if (isSet != null && isSet.booleanValue() == true) {
String unsetMethodName = "unset" + attrName;
Method unsetMethod = clazz.getMethod(unsetMethodName);
unsetMethod.invoke(obj, new Object[] {});
}
}
}
Примечание 1. Я немного изменил семантику сигнатуры вашего метода: второй аргумент (String[]
) - это фактически список атрибутов, которые вы хотите удалить. Я думаю, что это больше согласуется с именем метода (removeAttributes
), и это также упрощает вещи (используя unsetX
и isSetX
).
Примечание 2. Причина вызова isSetX
перед вызовом unsetX
заключается в том, что unsetX
выдает InvocationTargetException
, если вызывается, когда атрибут X
не установлен.
Примечание 3: Вы можете изменить обработку исключений в соответствии с вашими потребностями.