[英]How to parse XML inputstream into string or objects (Android studio)
[英]Parse XML on Android using inputstream from Cache
我想從Internet上的服務器解析XML文件並將其保存在本地一段時間,以便在失去連接的情況下仍可以在應用程序上看到信息。
我能夠從互聯網成功解析XML文件。 我還可以將其保存在緩存目錄getCacheDir()
,文件目錄getFilesDir()
和外部存儲中。
現在,我想解析本地XML文件,並且仍然想使用與從Internet解析XML相同的功能。 但是,經過幾次嘗試和數小時的搜索,我無法從Cache目錄或Files目錄中存儲的文件中解析輸入inputstream
。 該函數起作用的唯一目錄是外部目錄。
因此,此代碼的工作 :
inputstream is;
File file = new File ("/mnt/sdcard/Fmobile/Cache","Newfile.xml");
is = new BufferedInputStream(new FileInputStream(file));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document dom = db.parse(is);
雖然下面的代碼不起作用 。
inputstream is;
File file = new File (getFilesDir(),"Newfile.xml");
is = new BufferedInputStream(new FileInputStream(file));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document dom = db.parse(is); **// Error is given on this line : "Is a directory"**
誰能告訴我以上兩個代碼之間的區別是什么,或者應該執行什么操作才能從Cache目錄或Files目錄中獲取輸入流。 就是這樣,您知道我已經嘗試用文件路徑替換getFilesDir()
。
我搜索過的大多數解決方案都是關於將文件存儲在asset或res文件夾中的,但是我不能這樣做,因為它是一個動態文件,並且會不斷變化,這就是為什么我需要使用緩存和超時的原因。
我很抱歉張貼此文章時可能犯的任何錯誤。 這是我的第一篇文章。
日志貓如下:
04-04 11:27:24.579: I/com.example.app1.FMobileActivity(16029): Running Form [2] Local File
04-04 11:27:24.579: I/com.example.app1.FMobileActivity(16029): ProcessForm Data2
04-04 11:27:24.579: I/com.example.app1.FMobileActivity(16029): /data/data/com.example.app1/cache/Newfile2.xml
04-04 11:27:24.589: E/com.example.app1.FMobileActivity(16029): Error occurred in ProcessForm:Is a directory
04-04 11:27:24.589: W/System.err(16029): java.io.IOException: Is a directory
04-04 11:27:24.599: W/System.err(16029): at org.apache.harmony.luni.platform.OSFileSystem.read(Native Method)
04-04 11:27:24.599: W/System.err(16029): at dalvik.system.BlockGuard$WrappedFileSystem.read(BlockGuard.java:165)
04-04 11:27:24.599: W/System.err(16029): at java.io.FileInputStream.read(FileInputStream.java:290)
04-04 11:27:24.599: W/System.err(16029): at java.io.FileInputStream.read(FileInputStream.java:245)
04-04 11:27:24.609: W/System.err(16029): at java.io.BufferedInputStream.fillbuf(BufferedInputStream.java:140)
04-04 11:27:24.609: W/System.err(16029): at java.io.BufferedInputStream.read(BufferedInputStream.java:225)
04-04 11:27:24.609: W/System.err(16029): at org.kxml2.io.KXmlParser.setInput(KXmlParser.java:1044)
04-04 11:27:24.609: W/System.err(16029): at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:114)
04-04 11:27:24.609: W/System.err(16029): at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:107)
04-04 11:27:24.609: W/System.err(16029): at com.example.app1.FMobileActivity.GetFormData(FMobileActivity.java:315)
04-04 11:27:24.609: W/System.err(16029): at com.example.app1.FMobileActivity.onCreate(FMobileActivity.java:58)
04-04 11:27:24.609: W/System.err(16029): at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:1666)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:1727)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.access$1500(ActivityThread.java:124)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:974)
04-04 11:27:24.609: W/System.err(16029): at android.os.Handler.dispatchMessage(Handler.java:99)
04-04 11:27:24.609: W/System.err(16029): at android.os.Looper.loop(Looper.java:130)
04-04 11:27:24.609: W/System.err(16029): at android.app.ActivityThread.main(ActivityThread.java:3859)
04-04 11:27:24.609: W/System.err(16029): at java.lang.reflect.Method.invokeNative(Native Method)
04-04 11:27:24.609: W/System.err(16029): at java.lang.reflect.Method.invoke(Method.java:507)
04-04 11:27:24.609: W/System.err(16029): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
04-04 11:27:24.609: W/System.err(16029): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:647)
04-04 11:27:24.609: W/System.err(16029): at dalvik.system.NativeStart.main(Native Method)
04-04 11:27:24.609: E/com.example.app1.FMobileActivity(16029): Couldn't parse the Form.
04-04 11:27:24.689: D/dalvikvm(16029): GC_EXTERNAL_ALLOC freed 118K, 48% free 2837K/5379K, external 2743K/2773K, paused 33ms
嘗試這個
File sdcard = Environment.getExternalStorageDirectory();
File file = new File(sdcard,"/Newfile.xml");
InputStream is = new BufferedInputStream(new FileInputStream(file));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
Document dom = db.parse(is);
我最終使用以下命令從字符串中獲取文檔。 可以通過下載文件或本地讀取文件來獲取字符串。 所以它解決了我遇到的問題。 如果有人需要幫助以字符串形式獲取本地文件的內容,請在評論中告訴我。 從在線服務器獲取數據非常簡單。
public final static Document XMLfromString(String xml)
{
if(xml!=null)
{
/* Replace the & in string with & (if any) */
String xmlNew=clearRefs(xml);
Document doc = null;
// Log.v(tag,"After Clearing refs::"+xmlNew);
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
Log.v(tag,"Trying Obtaining Document");
try {
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(xmlNew));
doc = db.parse(is);
} catch (ParserConfigurationException e) {
Log.e(tag,"XML parse error: " + e.getMessage());
return null;
} catch (SAXException e) {
connectionStatus="No data received";
e.printStackTrace();
return null;
} catch (IOException e) {
Log.e(tag,"I/O exeption: " + e.getMessage());
connectionStatus="No data received";
return null;
}
return doc;
}
else
{
connectionStatus="Null string Passed";
return null;
}
}
當您下載xml文件時,請使用以下代碼:
try {
URL urlxml = new URL(YOUR_XML_FILE_URL);
URLConnection ucon = urlxml.openConnection();
ucon.setConnectTimeout(4000);
ucon.setReadTimeout(4000);
InputStream is = ucon.getInputStream();
BufferedInputStream bis = new BufferedInputStream(is, 128);
FileOutputStream fOut =this.openFileOutput("myFile.xml", Context.MODE_WORLD_READABLE);
OutputStreamWriter osw = new OutputStreamWriter(fOut);
int length = ucon.getContentLength();
int current = 0;
long total = 0;
while ((current = bis.read()) != -1) {
total += current;
osw.write((byte) current);
}
osw.flush();
osw.close();
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
finishUpdate = false;
e.printStackTrace();
} catch (IOException e) {
// TODO: handle exception
finishUpdate = false;
}
對於撤回和解析下載的xml文件,請使用:
SAXParserFactory fabrique = SAXParserFactory.newInstance();
SAXParser parseur = null;
ArrayList temp = null;
try {
parseur = fabrique.newSAXParser();
DefaultHandler handler = new ParserXMLHandler();
File fs=context.getFilesDir();
File file = new File(fs.getAbsoluteFile(),"Myfile.xml");
parseur.parse(file, handler);
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ParserConfigurationException e) {
e.printStackTrace();
}
db.parse正在獲取“文件”並返回“文檔”。
也許您需要將諸如db.parse(is)的代碼更改為db.parse(file)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.