Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/368.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
Javascript 解析Java应用程序的js文件_Javascript_Java_Android_Rhino - Fatal编程技术网

Javascript 解析Java应用程序的js文件

Javascript 解析Java应用程序的js文件,javascript,java,android,rhino,Javascript,Java,Android,Rhino,我正在使用jsoup解析来自网站的HTML。有两个选项列表是从javascript文件中的多维数组动态创建的。由于其动态创建的jsoup无法在html中解析结果。但是,我需要的所有数据都位于JS文件中。理想情况下,我希望能够定期加载该文件,并将该文件中的阵列数据持久化/刷新到android应用程序上的本地数据库中。有问题的JS文件是,显示列表的网站是,有没有一种方法可以下载此文件的某些方面,以便在Java中对其进行操作,就像您在html中使用DOM一样?您可以使用一个或您可以使用引擎。后一种方法

我正在使用
jsoup
解析来自网站的HTML。有两个选项列表是从javascript文件中的多维数组动态创建的。由于其动态创建的
jsoup
无法在html中解析结果。但是,我需要的所有数据都位于JS文件中。理想情况下,我希望能够定期加载该文件,并将该文件中的阵列数据持久化/刷新到android应用程序上的本地数据库中。有问题的JS文件是,显示列表的网站是,有没有一种方法可以下载此文件的某些方面,以便在Java中对其进行操作,就像您在html中使用DOM一样?

您可以使用一个或您可以使用引擎。后一种方法描述如下

第一个(当前版本为1.7.7.1)

将rhino jar(例如,
rhino-1.7.7.1.jar
)从lib文件夹复制到android项目中的libs文件夹

将依赖项添加到build.gradle(模块:app)文件中:

dependencies {
    [other dependencies]
    compile files('libs/rhino-1.7.7.1.jar')
}
下面的示例活动加载脚本文件、修改脚本(请参见注释)并执行函数以填充数组。然后检索数组并将其存储为java中的数组:

MainActivity.java

import android.os.AsyncTask;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;

import org.mozilla.javascript.Context;
import org.mozilla.javascript.Function;
import org.mozilla.javascript.NativeArray;
import org.mozilla.javascript.Scriptable;
import org.mozilla.javascript.ScriptableObject;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;

public class MainActivity extends AppCompatActivity {

    String[][] deptarray;
    String[][] zonearray;
    String[][] roomarray;
    String[][] studsetarrayByCode;
    String[][] studsetarrayByTitle;
    String[][] staffarray;
    String[][] roombydeptarray;
    String[][] modulearrayByCode;
    String[][] modulearrayByTitle;
    String[][] progarrayByCode;
    String[][] progarrayByTitle;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        new RetrieveJSFileTask().execute("http://timetables.itsligo.ie:81/js/filter.js");
    }


    class RetrieveJSFileTask extends AsyncTask<String, Void, String> {

        protected String doInBackground(String... urls) {
            try {
                URL url = new URL(urls[0]);

                BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
                StringBuilder builder = new StringBuilder();
                String line="";
                boolean store = false;

                builder.append("var deptarray;");
                builder.append("var zonearray;");

                while ((line = in.readLine()) != null) {

                    if(line.startsWith("var roomarray = ")||line.startsWith("var studsetarray =")||line.startsWith("var staffarray =")||line.startsWith("var roombydeptarray =")||line.startsWith("var modulearray =")||line.startsWith("var progarray =")){
                        builder.append(line);
                        continue;
                    }else if(line.contains("function PopulateFilter(strZoneOrDept, cbxFilter)")){ // populates dept and zone
                        store = true;
                    }
                    else if(line.contains("function FilterModulesByCode(Form) {") || line.contains("function FilterModulesByTitle(Form) {") ){ // populates module
                        store = true;
                    }
                    else if(line.contains("function FilterStudentSetsByCode(Form) {") || line.contains("function FilterStudentSetsByTitle(Form) {") ){ // populates studset
                        store = true;
                    }
                    else if(line.contains("function FilterRooms(Form) {") ){ // populates room
                        store = true;
                    }
                    else if(line.contains("function FilterRoomsByDept(Form) {") ){ // populates roombydept
                        store = true;
                    }
                    else if( line.contains("function FilterProgrammesByCode(Form) {") || line.contains("function FilterProgrammesByTitle(Form) {") ){ // populates prog
                        store = true;
                    }
                    else if(line.contains("function FilterStaff(Form) {") ){ // populates staff
                        store = true;
                    }
                    else if(line.contains("var zonearray") || line.contains("var deptarray") ){ // make zone and dept global
                        line = line.replace("var ", "");
                    }

                    if(store){
                        builder.append(line);
                    }

                    if( line.contains("zonearray.sort()") || line.contains("modulearray.sort();") || line.contains("studsetarray.sort();") || line.contains("roomarray.sort();") || line.contains(" roombydeptarray.sort();") || line.contains(" progarray.sort();") || line.contains("staffarray.sort();") ){
                        builder.append("return;}"); // stop function execution after population of arrays
                        store = false;
                        continue;
                    }
                }
                in.close();
                return builder.toString();

            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }

        protected void onPostExecute(String jsSource) {

            if(jsSource==null) return;

            Context rhino = Context.enter();

            // Turn off optimization to make Rhino Android compatible
            rhino.setOptimizationLevel(-1);

            Scriptable scope = rhino.initStandardObjects();
            ScriptableObject.putProperty(scope, "javaContext", Context.javaToJS(this, scope));
            rhino.evaluateString(scope, jsSource, "ScriptAPI", 1, null);

            ((Function)scope.get("PopulateFilter", scope)).call(rhino, scope, scope, new Object[]{null,null});
            deptarray = getArray((NativeArray)scope.get("deptarray", scope));
            zonearray = getArray((NativeArray)scope.get("zonearray", scope));

            ((Function)scope.get("FilterModulesByCode", scope)).call(rhino, scope, scope, new Object[]{null});
            modulearrayByCode = getArray((NativeArray)scope.get("modulearray", scope));

            ((Function)scope.get("FilterModulesByTitle", scope)).call(rhino, scope, scope, new Object[]{null});
            modulearrayByTitle = getArray((NativeArray)scope.get("modulearray", scope));

            ((Function)scope.get("FilterStudentSetsByCode", scope)).call(rhino, scope, scope, new Object[]{null});
            studsetarrayByCode = getArray((NativeArray)scope.get("studsetarray", scope));

            ((Function)scope.get("FilterStudentSetsByTitle", scope)).call(rhino, scope, scope, new Object[]{null});
            studsetarrayByTitle = getArray((NativeArray)scope.get("studsetarray", scope));

            ((Function)scope.get("FilterRooms", scope)).call(rhino, scope, scope, new Object[]{null});
            roomarray = getArray((NativeArray)scope.get("roomarray", scope));

            ((Function)scope.get("FilterRoomsByDept", scope)).call(rhino, scope, scope, new Object[]{null});
            roombydeptarray = getArray((NativeArray)scope.get("roombydeptarray", scope));

            ((Function)scope.get("FilterProgrammesByCode", scope)).call(rhino, scope, scope, new Object[]{null});
            progarrayByCode = getArray((NativeArray)scope.get("progarray", scope));

            ((Function)scope.get("FilterProgrammesByTitle", scope)).call(rhino, scope, scope, new Object[]{null});
            progarrayByTitle = getArray((NativeArray)scope.get("progarray", scope));

            ((Function)scope.get("FilterStaff", scope)).call(rhino, scope, scope, new Object[]{null});
            staffarray = getArray((NativeArray)scope.get("staffarray", scope));

            printArray(deptarray, "deptarray");
            printArray(zonearray, "zonearray");
            printArray(modulearrayByCode, "modulearrayByCode");
            printArray(modulearrayByTitle, "modulearrayByTitle");
            printArray(studsetarrayByCode, "studsetarrayByCode");
            printArray(studsetarrayByTitle, "studsetarrayByTitle");
            printArray(roomarray, "roomarray");
            printArray(roombydeptarray, "roombydeptarray");
            printArray(progarrayByCode, "progarrayByCode");
            printArray(progarrayByTitle, "progarrayByTitle");
            printArray(staffarray, "staffarray");

            Context.exit();
        }

        private void printArray(String[][] array, String tag){
            String output = "";
            for(int row=0;row<array.length;row++){
                for(int column=0;column<array[row].length;column++){
                    output+=array[row][column]+"\n";
                }
            }
            Log.e( (tag==null?"JavaArray":tag),output);
        }

        private String[][] getArray(NativeArray nativeArray){
            String[][] javaArray = new String[nativeArray.size()][((NativeArray)nativeArray.get(0)).size()];
            for (Integer row : nativeArray.getIndexIds()) {
                for(int column=0;column<((NativeArray)nativeArray.get(row)).size();column++){
                    javaArray[row][column] = (String)((NativeArray) nativeArray.get(row)).get(column);
                }
            }
            return javaArray;
        }

    }

}
导入android.os.AsyncTask;
导入android.support.v7.app.AppActivity;
导入android.os.Bundle;
导入android.util.Log;
导入org.mozilla.javascript.Context;
导入org.mozilla.javascript.Function;
导入org.mozilla.javascript.NativeArray;
导入org.mozilla.javascript.Scriptable;
导入org.mozilla.javascript.ScriptableObject;
导入java.io.BufferedReader;
导入java.io.InputStreamReader;
导入java.net.URL;
公共类MainActivity扩展了AppCompatActivity{
字符串[][]deptarray;
字符串[][]zonearray;
字符串[][]roomarray;
字符串[][]studsetarrayByCode;
字符串[][]studsetarrayByTitle;
字符串[][]staffarray;
字符串[][]roombydeptarray;
字符串[][]modulearrayByCode;
字符串[]modulearrayByTitle;
字符串[][]prograryByCode;
字符串[][]progarrayByTitle;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
新建RetrieveJSFileTask()。执行(“http://timetables.itsligo.ie:81/js/filter.js");
}
类RetrieveJSFileTask扩展了AsyncTask{
受保护的字符串doInBackground(字符串…URL){
试一试{
URL=新URL(URL[0]);
BufferedReader in=新的BufferedReader(新的InputStreamReader(url.openStream());
StringBuilder=新的StringBuilder();
字符串行=”;
布尔存储=假;
builder.append(“var deptarray;”);
附加(“var zonearray;”;
而((line=in.readLine())!=null){
if(line.startsWith(“var-roomarray=)| | line.startsWith(“var-studsetarray=)| | line.startsWith(“var-staffarray=)| | line.startsWith(“var-roombydeptarray=)| line.startsWith(“var-modulearray=)| | line.startsWith(“var-prograray=)){
builder.append(行);
继续;
}else if(line.contains(“函数PopulateFilter(strzoneOrder,cbxFilter)”){//填充部门和区域
store=true;
}
else如果(line.contains(“函数FilterModulesByCode(Form){”)| | line.contains(“函数filtermodulesbycytle(Form){”){//填充模块
store=true;
}
else如果(line.contains(“函数FilterStudentSetsByCode(Form){”)| | line.contains(“函数FilterStudentSetsByTitle(Form){”){//填充studset
store=true;
}
else如果(line.contains(“函数filterooms(Form){”){//填充文件室
store=true;
}
else if(line.contains(“函数FilterRoomsByDept(Form){”){//填充roombydept
store=true;
}
else如果(line.contains(“函数FilterProgrammesByCode(Form){”)| | line.contains(“函数FilterProgrammesByTitle(Form){”){//填充程序
store=true;
}
else if(line.contains(“函数FilterStaff(Form){”){//填充staff
store=true;
}
else if(line.contains(“var zonearray”)| | line.contains(“var deptarray”){//使区域和部门成为全局的
行=行。替换(“变量”,“变量”);
}
如果(商店){
builder.append(行);
}
if(line.contains(“zonearray.sort()”)| line.contains(“modulearray.sort()”)| line.contains(“studsetarray.sort()”))| line.contains(“roomarray.sort()”)| line.contains(“prograray.sort()”)| line.contains(“staffarray.sort()”))| line.contains(“staffarray.sort()”){
append(“return;}”);//填充数组后停止函数执行
存储=假;
继续;
}
}
in.close();
返回builder.toString();
}捕获(例外e){
e、 printStackTrace();
返回null;
}
}
受保护的void onPostExecute(字符串jsSource){
if(jsSource==null)返回;
Context rhino=Context.enter();
//关闭优化以使Rhino Android兼容
rhino.setOptimizationLevel(-1);
可编写脚本的范围=rhino.initStandardObjects();
ScriptableObject.putProperty(作用域,“javaContext”,Context.javaToJS(这个,