2011-02-28 30 views
0

属性を持つXMLBeansXmlObjectがあるとします。選択した属性を一度に取得するにはどうすればよいですか?XMLBeanの属性を削除する

は、私が何かのように期待してい....

removeAttributes(XmlObject obj, String[] selectableAttributes){}; 

は今、上記の方法は属性のみでくれ XMLObjectを返す必要があります。

答えて

1

想定:XmlObjectから削除する属性は、対応するXMLスキーマではオプションである必要があります。この仮定の下では、XMLBeansのは有用な方法のカップルを提供します:unsetXisSetXXは、あなたの属性名ですので、我々はこのように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)と一貫性があり、さらに簡略化すると思います(unsetXisSetX)。

注2:T彼は理由を呼び出す前にunsetXを呼び出すのは、Xが設定されていない場合、unsetXが呼び出されるとInvocationTargetExceptionを投げることになります。

注3:必要に応じて例外処理を変更できます。

+0

反射が遅いので、私は反射以外の何かが期待されます。時間と答えに感謝します。 – Phani

+0

XMLBeansを使いたい場合は、他の方法はありません。また、DOMレベルで作業することもできます。 – MarcoS

+0

それは理由の1つで、なぜ私が答えを受け入れたのか:) – Phani

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; 
} 
0

この単純な方法を使用して、要素内のすべてをクリーニングしています。 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(); 
} 
関連する問題