Android Studio中如何将在线URL的XML文件转为InputStream供DOM解析
实现步骤
1. 配置网络权限
在项目的AndroidManifest.xml文件的<manifest>节点下添加网络访问权限:
<uses-permission android:name="android.permission.INTERNET" />
如果后续需要访问HTTP协议的地址,还需要在<application>节点添加属性:android:usesCleartextTraffic="true",当前目标地址是HTTPS协议不需要额外配置。
2. 调整执行线程
Android系统禁止在主线程执行网络操作,否则会抛出NetworkOnMainThreadException异常,所以需要把网络请求、XML解析逻辑放到子线程执行,解析完成后再切回主线程更新TextView内容。
3. 修改InputStream获取逻辑
将原本读取本地Asset文件的逻辑替换为从目标URL获取输入流的逻辑,修改后的完整代码如下:
TextView tv; List<String> list = new ArrayList<>(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tv = findViewById(R.id.tv); // 启动子线程执行网络请求和解析 new Thread(() -> { XMLDOMParser parser = new XMLDOMParser(); InputStream stream; try { // 替换为从目标URL获取输入流 URL url = new URL("https://www.w3schools.com/xml/plant_catalog.xml"); stream = url.openConnection().getInputStream(); Document doc = parser.getDocument(stream); // 替换为XML中实际的节点名,当前XML的植物节点为PLANT NodeList nodeList = doc.getElementsByTagName("PLANT"); for (int i = 0; i < nodeList.getLength(); i++) { Element e = (Element) nodeList.item(i); // 替换为实际需要读取的子标签名,比如COMMON(植物通用名)、PRICE(价格)等 list.add(parser.getValue(e, "COMMON")); } // 切回主线程更新UI runOnUiThread(() -> tv.setText(list.toString())); } catch (Exception e) { e.printStackTrace(); // 异常也切回主线程更新 runOnUiThread(() -> tv.setText(e.toString())); } }).start(); }
内容的提问来源于stack exchange,提问作者richard.online
相关产品推荐
相关产品推荐

