我正在使用的XML文件是一个在线链接,结构如下:
编辑:
<forecasts>
<forecast date="yyyy-mm-dd">
<night>
<place>
<name>Chicago</name>
<tempmin>9</tempmin>
</place>
<place>
<name>Denver</name>
<tempmin>11</tempmin>
</place>
</night>
<day>
<place>
<name>Chicago</name>
<tempmax>19</tempmax>
</place>
<place>
<name>Denver</name>
<tempmax>20</tempmax>
</place>
</day>
</forecast>
</forecasts>
所以在主要活动中有一个ListView,它是显示所有地方(城市)的名称。
当用户做出选择时它应该做什么:
现在,我无法弄清楚的是,如何获得丹佛的tempmin和tempmax值(例如)并将它们显示给用户。以下是列出所有场所的代码段
ArrayList<String> mPlaces = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
try {
getPlaceList();
} catch(Exception ex) {
Toast.makeText(this, "Exception: " + ex.getMessage(), Toast.LENGTH_LONG).show();
}
ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
android.R.layout.simple_list_item_1, mPlaces);
setListAdapter(adapter);
ListView lv = getListView();
private void getPlaceList() throws Exception {
URL url = new URL("http://www.this.url/thisurl/xml/forecast.php");
InputSource inputSrc = new InputSource(url.openStream());
// query XPath instance, this is the parser
XPath xpath = XPathFactory.newInstance().newXPath();
String names = "//night/place/name";
NodeList nameList = (NodeList)xpath.evaluate(names, inputSrc, XPathConstants.NODESET);
if(nameList != null && nameList.getLength() > 0) {
mPlaces.clear();
int len = nameList.getLength();
for(int i = 0; i < len; ++i) {
// query value
Node node = nameList.item(i);
mPlaces.add(node.getTextContent());
}
}
}
答案 0 :(得分:1)
如果我正确理解了您的要求,您希望在<day/>
或<night/>
元素中获得某个位置。让我们假设您希望通过使用以下XPath来获取第二个<place/>
元素:
/forecast/(day, night)/place[2]
如果您有更多的父元素,并且您只想要所有这些元素,那么您也可以
/forecast/*/place[2]
如果您知道所选名称而不是位置,则可以使用它来选择位置元素:
/forecast/(day, night)/place[name = "Place 2"]
答案 1 :(得分:-1)
您是否控制XML的结构?如果是这样,我建议将其更改为
<forecast>
<place>
<name></name>
<tempmin></tempmin>
<tempmax></tempmax>
</place>
<place>
<name></name>
<tempmin></tempmin>
<tempmax></tempmax>
</place>
</forecast>
这个更小,并且包含所有信息(夜晚/白天并不重要,因为每个只保留一条信息)。如果您需要夜晚/白天,可以通过小调整添加。 XML以层次结构的方式存储数据,因此如果您确保遵循这一点,则处理它会更容易。
编辑:所以XML输入是固定的;您可以使用如下所示的XPATH表达式来获取最小/最大温度,了解地点的名称:
//place[name="place1"]/tempmin
//place[name="place1"]/tempmax
根据XML文件的大小,这可能不是很有效...你可能会更好地处理它并将其转换为Java对象,这将加速查找......