如何使用 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();
}
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();
}