2016-04-19 3 views
1
AutoPilot searchProperties = new AutoPilot(); 
searchProperties.selectXPath("/BatchItemSearchResultAnswer/Result/SearchProperties/Content/Item"); 
     searchProperties.bind(nav); 
     searchPro searchOption = new searchPro(); 
     while (searchProperties.evalXPath() != -1) { 
      //reuser 
      name.resetXPath(); 
      name.selectXPath("Name"); 
      searchOption.id = Id.evalXPathToString(); 
      searchOption.name = name.evalXPathToString(); 
      Log.e("SearchId", Id.evalXPathToString()); 
      Log.e("SearchName", name.evalXPathToString()); 
      Image.resetXPath(); 
      Image.selectXPath("/BatchItemSearchResultAnswer/Result/SearchProperties/Content/Item/Values/PropertyValue"); 
      searchOption.propertyList = new ArrayList(); 
      while (Image.evalXPath() != -1) { 
       property pro = new Property(); 
       pro.id = Id.evalXPathToString(); 
       Log.e("SearchPId", Id.evalXPathToString()); 
       Log.e("SearchPName", name.evalXPathToString()); 
       searchOption.propertyList.add(pro); 
      } 
     } 

使用してXMLで内部配列の子要素を取得するにはどのようにここに私のXMLximpleware

<SearchProperties><Content> <Item><Id>12345</Id><Name>scene</Name><Values><PropertyValue><Id>29</Id><Name>Le</Name></PropertyValue> <PropertyValue><Id>208</Id><Name>Business</Name></PropertyValue> </Values></Item><Item>..</Item></Content></SearchProperties> 

SearchProperties whileループ一度だけです。私はImage.selectPath( "")行を削除します。その時は正しくループするでしょう。 これを解決する方法。

ありがとうございました。

+0

コード書式がオフになっているようです... –

+0

私はちょうど質問を編集しました。 – AnanThDev

+0

私の答えがあなたのために働く場合、あなたは投票を与えることができます... –

答えて

1

あなたは、XPath評価を入れ子にしている...可能な限りwhileループのうち、XPathの選択を移動することは常に良いです。その理由は、XPathコンパイルは比較的遅い操作であるということです。XPathデータ構造を構築する必要があるため、xpath評価を高速化するさまざまな最適化を実行する必要があります。

マニュアルナビゲーションは、 XMLツリーを1回だけループするように指定しました...

また、別の関連する絶対XPath内に1つの絶対XPathをネストしました。これはパフォーマンス上非常に悪く、意味をなさない...私は変更しましたイメージオブジェクトのxpathは相対xpath "values/propertyValue"にバインドされます。

全体の目標は、無駄な計算を減らし、再利用を最大化することです。 XPathの再利用に関して、XPathの評価には4つの方法があることがわかります... evalXPath()evalXPathToString()evalXPathToBoolean()evalXPathToNumber()です。これらの4つのメソッドのうち、evalXPath()だけがその後の再利用のためにresetXPath()を必要とします...他の3はresetXPathを内部的に呼び出します。したがって、各呼び出しの後にresetXPath()を呼び出す必要はありません。

AutoPilot searchProperties = new AutoPilot(); 
AutoPilot image = new AutoPilot(vn); 
AutoPilot name = new AutoPilot(vn); 
name.selectXPath("Name"); 
Image.selectXPath("values/PropertyValue");// should use relative path here, makes a huge difference in performance 
searchProperties.selectXPath("/BatchItemSearchResultAnswer/Result/SearchProperties/Content/Item"); 


     searchProperties.bind(nav); 
     searchPro searchOption = new searchPro(); 
     while (searchProperties.evalXPath() != -1) { 
      //reuser 
      //name.resetXPath(); 

      searchOption.id = Id.evalXPathToString(); 
      searchOption.name = name.evalXPathToString(); 
      Log.e("SearchId", Id.evalXPathToString()); 
      Log.e("SearchName", name.evalXPathToString()); 


      searchOption.propertyList = new ArrayList(); 
      vn.push() 
      while (Image.evalXPath() != -1) { 
       property pro = new Property(); 
       pro.id = Id.evalXPathToString(); 
       Log.e("SearchPId", Id.evalXPathToString()); 
       Log.e("SearchPName", name.evalXPathToString()); 
       searchOption.propertyList.add(pro); 
      } 
      Image.resetXPath(); 
      vn.pop(); 
     } 
+0

あなたの応答をありがとう..それを試して更新します。 – AnanThDev

0

最終的に一日中結果を得ました。

if (navTemp.toElement(VTDNav.FC, "SearchProperties")) { 
          Log.e("Search", "SearchProperties"); 
          if (navTemp.toElement(VTDNav.FC, "Content")) { 
           Log.e("Search", "Content"); 
           if (navTemp.toElement(VTDNav.FC, "Item")) { 
            do { 
             SearchPropertiesItems item = new SearchPropertiesItems(); 
             if (navTemp.toElement(VTDNav.FC)) { 
              Log.e("Search", "Item"); 
              do { 

               if (!navTemp.matchElement("Values")) { 
                if (navTemp.toString(navTemp.getCurrentIndex()).equalsIgnoreCase("id")) { 
                 item.id = navTemp.toString(navTemp.getText()); 
                } else { 
                 item.name = navTemp.toString(navTemp.getText()); 
                } 
                //Log.e("SearchItem", navTemp.toString(navTemp.getCurrentIndex()) + "==>" + navTemp.toString(navTemp.getText())); 
               } else { 
                //if (navTemp.toElement(VTDNav.FC, "Values")) { 

                if (navTemp.toElement(VTDNav.FC, "PropertyValue")) { 
                 do { 
                  SearchPropertiesProperty property = new SearchPropertiesProperty(); 
                  if (navTemp.toElement(VTDNav.FC)) { 
                   do { 

                    if (navTemp.toString(navTemp.getCurrentIndex()).equalsIgnoreCase("id")) { 
                     property.id = navTemp.toString(navTemp.getText()); 
                    } else { 
                     property.name = navTemp.toString(navTemp.getText()); 
                    } 

                    // Log.e("SearchItem >>", navTemp.toString(navTemp.getCurrentIndex()) + "==>" + navTemp.toString(navTemp.getText())); 
                   } 
                   while (navTemp.toElement(VTDNav.NEXT_SIBLING)); 
                   navTemp.toElement(VTDNav.P); 
                   property.ItemId = item.id; 

                   item.properties.add(property); 
                  } 
                 } 
                 while (navTemp.toElement(VTDNav.NEXT_SIBLING)); 
                 navTemp.toElement(VTDNav.P); 
                } 
                // } 
               } 

              } while (navTemp.toElement(VTDNav.NEXT_SIBLING)); 
              navTemp.toElement(VTDNav.P); 
              productList.searchPropertiesItems.add(item); 
             } 
            } while (navTemp.toElement(VTDNav.NEXT_SIBLING)); 
           } 
          } 
         } 

参考リンク: http://vtd-xml.sourceforge.net/codeSample/cs5.html http://www.javaworld.com/article/2071745/soa/simplify-xml-processing-with-vtd-xml.html