android - 在 Android 中读取外部 XML 文件
问题描述
如何在android应用程序中读取外部XML文件的此类数据并在视图中设置
<?XML version="1.0"?>
<OKV
r="129120190116115414009"
a="Address" g="male" m="123456"
e="email" d="14021996" i="imagelink"
n="My Name" v="1"/>
解决方案
Android中解析XML的三种方式
DOM Parsers
SAX Parsers
XMLPullParser
跟着这些步骤
READ_EXTERNAL_STORAGE
首先,在清单文件中添加权限
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
然后检查 android marshmallow及以上的运行时权限
因为从 Android 6.0(API 级别 23)开始,用户在应用运行时授予应用权限,而不是在安装应用时
int grant = ContextCompat.checkSelfPermission(this, permission);
if (grant != PackageManager.PERMISSION_GRANTED) {
String[] permission_list = new String[1];
permission_list[0] = permission;
ActivityCompat.requestPermissions(this, permission_list, 1);
}
然后解析你的xml
这是使用的示例代码 DOM Parsers
示例代码
创建模型类
public class Model {
String rValue, aValue, eValue, nValue, gValue, dValue, vValue, mValue, iValue;
public String getrValue() {
return rValue;
}
public void setrValue(String rValue) {
this.rValue = rValue;
}
public String getaValue() {
return aValue;
}
public void setaValue(String aValue) {
this.aValue = aValue;
}
public String geteValue() {
return eValue;
}
public void seteValue(String eValue) {
this.eValue = eValue;
}
public String getnValue() {
return nValue;
}
public void setnValue(String nValue) {
this.nValue = nValue;
}
public String getgValue() {
return gValue;
}
public void setgValue(String gValue) {
this.gValue = gValue;
}
public String getdValue() {
return dValue;
}
public void setdValue(String dValue) {
this.dValue = dValue;
}
public String getvValue() {
return vValue;
}
public void setvValue(String vValue) {
this.vValue = vValue;
}
public String getmValue() {
return mValue;
}
public void setmValue(String mValue) {
this.mValue = mValue;
}
public String getiValue() {
return iValue;
}
public void setiValue(String iValue) {
this.iValue = iValue;
}
}
MainActivity 代码
public class MainActivity extends AppCompatActivity {
List<Model> modelArrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// first check for runtime permission
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
int grant = ContextCompat.checkSelfPermission(this, permission);
if (grant != PackageManager.PERMISSION_GRANTED) {
String[] permission_list = new String[1];
permission_list[0] = permission;
ActivityCompat.requestPermissions(this, permission_list, 1);
}else {
ParseXML();
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "READ_EXTERNAL_STORAGE permission granted", Toast.LENGTH_SHORT).show();
ParseXML();
} else {
Toast.makeText(MainActivity.this, " READ_EXTERNAL_STORAGE permission not granted", Toast.LENGTH_SHORT).show();
}
}
}
private void ParseXML() {
File dir = Environment.getExternalStorageDirectory();
File yourFile = new File(dir, "test.xml");
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(yourFile);
doc.getDocumentElement().normalize();
Log.e("Root_element" , doc.getDocumentElement().getNodeName());
NodeList nodeList = doc.getElementsByTagName("OKV");
modelArrayList = new ArrayList<Model>();
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
Model model = new Model();
model.setrValue(element.getAttribute("r"));
model.setaValue(element.getAttribute("a"));
model.setgValue(element.getAttribute("g" ));
model.setmValue(element.getAttribute("m" ));
model.seteValue(element.getAttribute("e" ));
model.setdValue(element.getAttribute("d" ));
model.setiValue(element.getAttribute("i"));
model.setnValue(element.getAttribute("n" ));
model.setvValue(element.getAttribute("v"));
modelArrayList.add(model);
}
for (int i = 0; i < modelArrayList.size(); i++) {
Log.e("DATA_VALUE", modelArrayList.get(i).getaValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getdValue());
Log.e("DATA_VALUE", modelArrayList.get(i).geteValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getnValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getvValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getgValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getrValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getiValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getmValue());
}
} catch (SAXException | ParserConfigurationException | IOException e1) {
e1.printStackTrace();
}
}
}
输出
01-19 13:23:39.545 15689-15689/neel.com.demo E/Root_element: OKV
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: Address
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 14021996
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: email
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: My Name
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 1
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: male
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 129120190116115414009
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: imagelink
01-19 13:23:39.545 15689-15689/neel.com.demo E/DATA_VALUE: 123456
有关更多信息,请查看以下文章
- Android - XML 解析器
- Android XML 解析器 – XMLPullParser
- 如何在 Java 中读取 XML 文件(DOM 解析器)
- Java SAX 解析器示例
- 如何使用回收器视图或在回收器视图的适配器中将 xml 解析为 java 类
- 在 Android 应用程序中解析 XML 数据
- 使用 DOM Parser 进行 Android XML 解析
- Android XML 解析教程
- 学习在您的 Android 应用程序中解析 XML 数据
更新
import android.Manifest;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;
import com.nbsp.materialfilepicker.MaterialFilePicker;
import com.nbsp.materialfilepicker.ui.FilePickerActivity;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
public class MainActivity extends AppCompatActivity {
List<Model> modelArrayList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// first check for runtime permission
String permission = Manifest.permission.READ_EXTERNAL_STORAGE;
int grant = ContextCompat.checkSelfPermission(this, permission);
if (grant != PackageManager.PERMISSION_GRANTED) {
String[] permission_list = new String[1];
permission_list[0] = permission;
ActivityCompat.requestPermissions(this, permission_list, 1);
} else {
pickFile();
}
}
private void pickFile() {
new MaterialFilePicker()
.withActivity(this)
.withRequestCode(1)
.withFilterDirectories(true)
.withHiddenFiles(true)
.start();
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 1 && resultCode == RESULT_OK) {
String filePath = data.getStringExtra(FilePickerActivity.RESULT_FILE_PATH);
Log.e("FILE_PATH", filePath);
ParseXML(filePath);
}
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions,
@NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == 1) {
if (grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "READ_EXTERNAL_STORAGE permission granted", Toast.LENGTH_SHORT).show();
pickFile();
} else {
Toast.makeText(MainActivity.this, " READ_EXTERNAL_STORAGE permission not granted", Toast.LENGTH_SHORT).show();
}
}
}
private void ParseXML(String path) {
File yourFile = new File(path);
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder;
try {
dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(yourFile);
doc.getDocumentElement().normalize();
Log.e("Root_element", doc.getDocumentElement().getNodeName());
NodeList nodeList = doc.getElementsByTagName("OKV");
modelArrayList = new ArrayList<Model>();
for (int i = 0; i < nodeList.getLength(); i++) {
Element element = (Element) nodeList.item(i);
Model model = new Model();
model.setrValue(element.getAttribute("r"));
model.setaValue(element.getAttribute("a"));
model.setgValue(element.getAttribute("g"));
model.setmValue(element.getAttribute("m"));
model.seteValue(element.getAttribute("e"));
model.setdValue(element.getAttribute("d"));
model.setiValue(element.getAttribute("i"));
model.setnValue(element.getAttribute("n"));
model.setvValue(element.getAttribute("v"));
modelArrayList.add(model);
}
for (int i = 0; i < modelArrayList.size(); i++) {
Log.e("DATA_VALUE", modelArrayList.get(i).getaValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getdValue());
Log.e("DATA_VALUE", modelArrayList.get(i).geteValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getnValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getvValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getgValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getrValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getiValue());
Log.e("DATA_VALUE", modelArrayList.get(i).getmValue());
}
} catch (SAXException | ParserConfigurationException | IOException e1) {
e1.printStackTrace();
}
}
}
注意我使用过的文件选择器AndroidFileExplorer
推荐阅读
- mariadb - 神秘的 mariadb 10.4.1 内存使用情况
- curl - 通过 REST 端点从 Kismet 检索设备时出现问题
- selenium - 如何加快 AWS 设备场上的 selenium 测试?
- excel - 工具 --> 参考和 VBA 编辑窗口未能出现在 Excel 365 中 - 文件损坏?
- reactjs - 来自两个 API 的搜索结果
- java - 当我尝试将 ArrayList 添加到 ArrayList 中时,第二个 ArrayList 正在重复
- vim - Vim 快捷键选择和复制当前行而不包含下一行
- c# - UWP 绑定到自定义字典
- python - 在 Flask 单元测试中测试失败并出现 404 错误
- javascript - 如何使用纯javascript获得相同的效果