如何使用Xpath(或使用什么)来获取来自不同父节点的不同节点子节点?

时间:2014-05-23 08:10:25

标签: java android xml xpath

我正在使用的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

现在,我无法弄清楚的是,如何获得丹佛的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());
        }
    }
}

2 个答案:

答案 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对象,这将加速查找......