2015-10-07 20 views
0

假設你知道它在圖中的哪裏,你如何從圖中獲取一個項目而不使用JXPath,根據文檔只是迭代直到它找到下一個節點,然後再次迭代下一個等等。 .. 對。嵌套循環。正是他們告訴我們要避免像大學裏的瘟疫一樣。我想避免的另一件事是這樣的:給定一個複雜的JAXB圖,從中抓取一個項目的最佳方法是什麼?

thingOne.getValue() 
    .getWidget().getValue() 
    .getAnotherWidget().getValue() 
    .getAdNauseum() 

所以,如果我想嘲笑這一個測試,我需要一個新的模擬在每一個剛剛返回下一個模擬的水平。恐怖...... ;-)

在這一點上,我會採取任何優化,我可以得到。即使這只是一種閃避方式getValue()

+0

爲什麼不直接使用的樣本數據,而不是嘲諷? – lexicore

+0

你在大學裏沒有專心地聽:-)對於(平均)長度爲n的k個層次的嵌套循環,你的確有可怕的O(n^k)。但是,要定位k個水平(平均)長度爲n的元素,您只需要O(k * n/2)。您不需要檢查所有可能的長度爲k的XPath以查找級別爲k的單個XPath目標... – laune

+0

讓我印象深刻,因爲我可以寫更好的東西。也許我現在需要專注於獲得新合同。我在一艘沉沒的船上。 – user447607

回答

0

您可以將對象轉換爲org.w3c.dom.Document中有:

JAXBContext contextJaxb = JAXBContext.newInstance(xml.getClass()); 
Marshaller marshaller = contextJaxb.createMarshaller(); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
dbf.setNamespaceAware(true); 
Document doc = dbf.newDocumentBuilder().newDocument(); 
marshaller.marshal(xml, doc); 

然後用搜索一個對象是:

private Element getFirstElementsByTagName(final String name, final Namespace nameSpace, final Element root) { 
    List<Element> list = new ArrayList<Element>(root.getChildren(name, nameSpace)); 
    Iterator<Element> iterator = root.getChildren().iterator(); 
    while(iterator.hasNext() && list.isEmpty()) { 
     Element next = iterator.next(); 
     Element element = this.getFirstElementsByTagName(name, nameSpace, next); 
     if(element != null) { 
      list.add(element); 
     } 
    } 
    if(!list.isEmpty()) { 
     return list.get(0); 
    } 
    return null; 
} 
+0

這看起來與JXPath答案非常相似,因爲它似乎不得不在每個級別使用它,從而導致嵌套循環。如果沒有,那麼看起來你會遇到一個名稱相同但位置不同的問題。但我可能是錯的。 – user447607

+0

如果你確切地知道如何走樹,以獲得該元素,那麼爲什麼不直接走樹取得元素?如果您只是在運行時才知道它,那麼您可以使用XPath:http://docs.oracle.com/javase/7/docs/api/javax/xml/xpath/package-summary.html –

+0

我認爲最終我可能正在努力解決在架構上最好解決的問題。恕我直言,如果這只是內部數據,那麼應該使用JSON而不是XML。在回答你的問題時,調用的嵌套與getValue的組合會返回一個泛型,從而導致模擬問題。你需要每個級別的新模擬。 – user447607

相關問題