2013-01-12 46 views
0

是否有可能在Simple框架中查找指定屬性的存在? 比方說,我有以下XML:簡單的框架xml反序列化 - 尋找屬性的存在

<packet id="250"> 
    <msg id="1" uniqueAttribute1="some value" x="7" /> 
    <msg id="2" someStuff="123" /> 
    <msg id="3" someOtherStuff="abc" /> 
</packet> 

所有上述封郵件應反序列化爲也許是從一個共同的基類繼承不同的類的對象。哪個msg應該實例化哪個類應該依賴於某個屬性的名稱。意思是如果存在msg中存在名爲'uniqueAttribute'的屬性,則應該創建類Foo的對象,如果存在'someStuff'類Bar的對象等等。

我想到的唯一方法是嘗試反序列化到類的對象並捕獲異常並重試哪些聲音很糟糕。

如果'簡單'框架不可能,也許你可以建議一些其他方法?

回答

1

我沒有看到需要這樣一個基本要求的框架,但我可能再也不能完全理解你的需求。我將首先從一個簡單的SAX解析處理程序開始。完全手工編碼的和未經考驗的,但一個基本的理念在這裏看到:

import org.xml.sax.SAXException; 
import org.xml.sax.helpers.DefaultHandler; 

class XmlHandler extends DefaultHandler { 
    Map msgClasses = new HashMap(){{ put("uniqueAttribute1", "Foo"); put("someStuff", "Bar"); }}; 

    public MessageBase messageFromAttributes(final org.xml.sax.Attributes attributes) { 
     for(int i=0; i<attributes.getLength(); i++) { 
      if(msgClasses.contains(attributes.getValue(i))) { 
       try{ 
        Class msgClass = Class.forName(attributes.getValue(i)); 
        return msgClass.newInstance(); 
       } catch(ClassNotFoundException e) { 
        return null; 
       } 
      } 
     } 
    } 

    @Override 
    public final void startElement(String uri, String localName, String name, 
      final org.xml.sax.Attributes attributes) throws SAXException { 
     if (localName.equals("msg")) { 
      MessageBase message = messageFromAttributes(attributes); 
     } 
    } 

    @Override 
    public final void endElement(String uri, String localName, String name) throws SAXException { 

     if (localName.equals("msg")) { 
     } 
    } 

} 

我上面的例子中的思想是類名特定屬性映射,然後在處理SAX解析事件實例發現任何給定的屬性在映射中應該指向正確的類名。此時,您可以使用反射來實例化該類並繼續。如有必要,您可以選擇使用剩餘的屬性值填充類。