如何使用 ximpleware 在 XML 中获取内部数组子元素

How to get Inner array child element in XML using ximpleware

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

<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("") 行时。那个时候它会正确循环。 如何解决这个问题。

提前致谢。

终于花了一整天的时间得到了结果。

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

您正在嵌套 XPath 求值...最好尽可能将 XPath 选择移出 while 循环。原因是编译XPath相对来说是一个比较慢的操作...因为它需要构建XPath数据结构,进行各种加速xpath评估的优化...

手动导航在您的用例中可能更有效,因为您已经指出您只想循环遍历 XML 树一次...

您还将一个绝对 XPath 嵌套在另一个相关的绝对 XPath 中,这对性能非常不利,并且没有真正意义...我将图像对象的 xpath 绑定更改为相对 xpath "values/propertyValue ."

总体目标是减少浪费的计算并最大限度地重用。关于 XPath 重用,如您所知,有 4 种 XPath 评估方法...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();
       }