2011-07-08 58 views
0

如果這是一個簡單的修復(我敢肯定它可能是),但對我和我的朋友谷歌幾小時後,我很空虛。Android XML +對象存儲

我有一個XML文件,我從服務器檢索(使用httpclient處理善良的cookie)。我現在希望通過XML進行搜索。 XML定義了一組具有屬性的撲克牌。作爲一個例子,它會是這樣的。

<CardInfo> 
    <Type> 
      Player 
    </Type> 
    <ID> 
      674868 
    </ID> 
</CardInfo> 

這裏顯然會有更多的屬性,但這只是爲了舉例說明。 可能有許多'cardinfo'是每個XML我拉,我想某種方式來過濾XML來存儲每張卡,並使卡的屬性以易於訪問的形式。我顯然不期望所有這些爲我完成,但認爲上下文可能對任何解決方案都很重要。

我很抱歉問這個問題,而且這樣做感覺很糟糕,但即使是XML解析和存儲對於一個android nooby來說也很困難! (爲什麼他們不能讓我們在Python中爲上帝的愛做這件事)。

回答

1

使用XML pull-parser。它給你的XML文檔是它的邏輯部分,每部分的部分(事件)。因此,對於每個CardInfo元素,創建一個新的CardInto對象,併爲元素名稱「類型」設置了CardInfo類型和元素名稱「ID」你設定的CardInfo型等

更新 添加讀取和寫入方法到你的對象,或者創建一個獨立的類來讀/寫XML:

這個例子是針對StAX API的,但我想你會得到圖片(方法和事件類型是相同的,但是有不同的名字)。

在爲MyObject:

public void read(XMLStreamReader reader) throws XMLStreamException { 
    int event; 

    // read to the first tag, so we are at level 1 
    do { 
     event = reader.next(); 
     if(event == XMLStreamConstants.START_ELEMENT) { 
      break; 
     } 

    } while(reader.hasNext()); 

    int level = 1; 
    do { 
     event = reader.next(); 
     if(event == XMLStreamConstants.START_ELEMENT) { 
      level++; // increment 

      String localName = reader.getLocalName(); 

      if(localName.equals("Domain")) { 
       event = reader.next(); 
       if(event == XMLStreamConstants.CHARACTERS) { 
        domain = reader.getText(); 
       } 
      } else if(localName.equals("URL")) { 
       event = reader.next(); 
       if(event == XMLStreamConstants.CHARACTERS) { 
        url = reader.getText(); 
       } 
      } else if(localName.equals("Headers")) { 
       readHeaders(reader); 
       level--; 
      } else throw new IllegalArgumentException("Unexpected element " + localName + " at " + reader.getLocation()); 
     } 


     if(event == XMLStreamConstants.END_ELEMENT) { 
      level--; // decrement 
     } 
    } while(level > 0); // simple level check 


} 

解析亞型稱爲標題:

<Headers> 
    <Header name="" value=""/> 
    <Header name="" value=""/> 
    <Header name="" value=""/> 
</Headers> 

使用的代碼

private void readHeaders(XMLStreamReader reader) throws XMLStreamException { 
    int level = 1; 

    int event; 
    do { 
     event = reader.next(); 
     if(event == XMLStreamConstants.START_ELEMENT) { 
      level++; 

      String localName = reader.getLocalName(); 

      if(localName.equals("Header")) { 
       CodeRequestHeader header = new CodeRequestHeader(); 
       header.setName(reader.getAttributeValue(null, "name")); 
       header.setValue(reader.getAttributeValue(null, "value")); 
       headers.add(header); 
      } 
     } else if(event == XMLStreamConstants.END_ELEMENT) { 
      level--; 
     } 
    } while(level > 0); 
} 

現在有這樣的東西多種方式,但最重要的事情是這些:

  1. 首先轉到1級;讀根元素
  2. 開始一個do-while循環在1級
  3. 開始和結束元素遞增和遞減水平,使水平是正確的
  4. 使用來控制while循環的水平,繼續只要水平> 0
  5. 對於子元素(即某些標記包含映射到對象實體的多個標記),請創建一個重複步驟2-4的新方法。然後在使用該方法時將等級減1。

如果您使用這種模式,您可以以有序且嚴格,合理的方式拉解析n維XML文檔。嚴格地說,規則意味着應該是readHeaders方法中的'readHeader'方法,但是如果Header元素中沒有子元素,則不需要這樣做。玩得開心;)

+0

這是粉碎 - 非常感謝指針! :D – Chris

+0

我已經設法獲取流並使用XML拉解析器來獲取項目 - 在systemout上打印它們。我將如何創建所需的對象並存儲這些對象? – Chris

+0

se更新回覆 – ThomasRS