属性を持つXMLBeansXmlObject
があるとします。選択した属性を一度に取得するにはどうすればよいですか?XMLBeanの属性を削除する
は、私が何かのように期待してい....
removeAttributes(XmlObject obj, String[] selectableAttributes){};
は今、上記の方法は属性のみでくれ
XMLObject
を返す必要があります。
属性を持つXMLBeansXmlObject
があるとします。選択した属性を一度に取得するにはどうすればよいですか?XMLBeanの属性を削除する
は、私が何かのように期待してい....
removeAttributes(XmlObject obj, String[] selectableAttributes){};
は今、上記の方法は属性のみでくれ
XMLObject
を返す必要があります。
想定: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:私は少し持っているがメソッドのシグネチャのセマンティクスを変更しました.2番目の引数(String[]
)は実際には削除する属性のリストです。メソッド名(removeAttributes
)と一貫性があり、さらに簡略化すると思います(unsetX
とisSetX
)。
注2:T彼は理由を呼び出す前にunsetX
を呼び出すのは、X
が設定されていない場合、unsetX
が呼び出されるとInvocationTargetException
を投げることになります。
注3:必要に応じて例外処理を変更できます。
私はあなたがカーソルを使用することができると思う...彼らは扱いが面倒ですが、反射もそうです。
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;
}
この単純な方法を使用して、要素内のすべてをクリーニングしています。 cursor.removeXmlContentsを省略すると、属性のみを削除できます。 2番目のカーソルは、初期位置に戻るために使用されます:
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();
}
反射が遅いので、私は反射以外の何かが期待されます。時間と答えに感謝します。 – Phani
XMLBeansを使いたい場合は、他の方法はありません。また、DOMレベルで作業することもできます。 – MarcoS
それは理由の1つで、なぜ私が答えを受け入れたのか:) – Phani