假设有XMLBeans XmlObject
属性,如何在一步中获取所选属性?
我期待像什么......
removeAttributes(XmlObject obj, String[] selectableAttributes){};
现在上面的方法应该只返回XMLObject
,只包含那些属性。
答案 0 :(得分:1)
假设:您要从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:您可能希望根据需要更改异常处理。
答案 1 :(得分:1)
我认为你可以使用光标......它们处理起来很麻烦,但反射也是如此。
public static XmlObject RemoveAllAttributes(XmlObject xo) {
return RemoveAllofType(xo, TokenType.ATTR);
}
public static XmlObject RemoveAllofTypes(XmlObject xo, final TokenType... tts) {
printTokens(xo);
final XmlCursor xc = xo.newCursor();
while (TokenType.STARTDOC == xc.currentTokenType() || TokenType.START == xc.currentTokenType()) {
xc.toNextToken();
}
while (TokenType.ENDDOC != xc.currentTokenType() && TokenType.STARTDOC != xc.prevTokenType()) {
if (ArrayUtils.contains(tts, xc.currentTokenType())) {
xc.removeXml();
continue;
}
xc.toNextToken();
}
xc.dispose();
return xo;
}
答案 2 :(得分:0)
我使用这个简单的方法来清理元素中的所有内容。您可以省略 cursor.removeXmlContents 以仅删除属性。第二个光标用于返回初始位置:
public static void clearElement(final XmlObject object)
{
final XmlCursor cursor = object.newCursor();
cursor.removeXmlContents();
final XmlCursor start = object.newCursor();
while (cursor.toFirstAttribute())
{
cursor.removeXml();
cursor.toCursor(start);
}
start.dispose();
cursor.dispose();
}