Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用Xpath从不同的父节点获取不同的节点子节点(或者使用什么替代)?_Java_Android_Xml_Xpath - Fatal编程技术网

Java 如何使用Xpath从不同的父节点获取不同的节点子节点(或者使用什么替代)?

Java 如何使用Xpath从不同的父节点获取不同的节点子节点(或者使用什么替代)?,java,android,xml,xpath,Java,Android,Xml,Xpath,我正在使用的XML文件是一个在线strem,其结构如下: 编辑: 芝加哥 9 丹佛 11 芝加哥 19 丹佛 20 因此,在主活动中有一个列表视图,用于显示所有地方(城市)的名称 当用户做出选择时,它应该做什么: 启动一个新的活动,程序将在其中运行 显示地点的名称 显示用户选择的tempmin和tempmax值 现在,我不明白的是,如何获取丹佛的tempmin和tempmax值(例如),并将它们显示给用户。下面是列出所有位置的代码片段 ArrayList<String> m

我正在使用的XML文件是一个在线strem,其结构如下:
编辑:


芝加哥
9
丹佛
11
芝加哥
19
丹佛
20

因此,在主活动中有一个列表视图,用于显示所有地方(城市)的名称 当用户做出选择时,它应该做什么:

  • 启动一个新的活动,程序将在其中运行
  • 显示地点的名称
  • 显示用户选择的tempmintempmax
现在,我不明白的是,如何获取丹佛的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());
        }
    }
}
ArrayList mPlaces=new ArrayList();
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
试一试{
getPlaceList();
}捕获(例外情况除外){
Toast.makeText(这个,“异常:+ex.getMessage(),Toast.LENGTH_LONG.show();
}
ArrayAdapter=新的ArrayAdapter(此,
android.R.layout.simple_list_item_1,mPlaces);
setListAdapter(适配器);
ListView lv=getListView();
私有void getPlaceList()引发异常{
URL=新URL(“http://www.this.url/thisurl/xml/forecast.php");
InputSource inputSrc=新的InputSource(url.openStream());
//查询XPath实例,这是解析器
XPath=XPathFactory.newInstance().newXPath();
String names=“//night/place/name”;
NodeList nameList=(NodeList)xpath.evaluate(name、inputSrc、xpathctants.NODESET);
if(nameList!=null&&nameList.getLength()>0){
mPlaces.clear();
int len=nameList.getLength();
对于(int i=0;i
您是否控制XML的结构?如果是,我建议将其更改为

<forecast>
    <place>
        <name></name>
        <tempmin></tempmin>
        <tempmax></tempmax>
    </place>
    <place>
        <name></name>
        <tempmin></tempmin>
        <tempmax></tempmax>
    </place>
</forecast>

尽管如此,根据XML文件的大小,性能可能不是很好……您可能会更好地动态处理它,并将其转换为Java对象,这将加快查找速度……

如果我正确理解您的需求,您希望在
元素中获得某个位置如果要获取第二个
元素,可以使用以下XPath:

/forecast/(day, night)/place[2]
如果您有更多的父元素,并且只需要所有的父元素,那么您也可以这样做

/forecast/*/place[2]
如果知道选定的名称而不是位置,则可以使用它来选择位置元素:

/forecast/(day, night)/place[name = "Place 2"]

不,我忘了提到XML是来自URL的在线流。我将在我的问题中添加此内容。你的回答完全错误。首先,简单地更改XML输入从来都不是好的建议。即使它可以更改,也可能有很好的理由使XML保持原样。在这种情况下,很明显白天和夜间预测之间存在语义差异。您的最后一句话更糟糕,因为它甚至可能有害。将完整的XML文档转换为Java对象而不是使用体面的XPath处理器肯定不会更快。我需要同时使用夜间(tempmin)和白天(tempmax)所选地点的要素。因此,这应该适合您。如果您仍然有任何问题,请描述它们。这看起来不错。但我不太确定它是否适合我。已尝试/预测/(夜间,白天)/在主活动中放置/名称,只是以更复杂的方式将名称放入ListView中-没有成功。TransformerException:需要@Dirkk的位置步骤可能是您的XPath处理器不支持此语法。您可能需要尝试使用union运算符,即
/forecast/day/place[2]|/forecast/night/place[2]
这将再次返回同一位置两次。主要目标是获取用户所选位置的tempmin和tempmax值。@dirkk
/forecast/*/place[2]
/forecast/(day, night)/place[name = "Place 2"]