新手使用android的XML(DOM)解析问题,指定路径XML如何读取

新手使用android的XML(DOM)解析问题,指定路径XML如何读取,第1张

一、在Android应用中的XML文件来源

1、本地xml文件

本地XML文件可以放在应用根目录assets文件夹、res/xml、res/raw、SDcard卡、应用的data目录等;

除res/xml可直接通过getXml(int id)获取XML文档,返回一个解析器对象(XmlResourceParer:XmlResourceParer是XmlPullParser的子类),其它位置情况都可以获取XML文档,返回一个Inputstream对象,进行读取数据,获取方法分别如下:

a在res/xml目录下(推荐使用):

[java] view plaincopy

XmlResourceParser xmlParser = thisgetResources()getXml(RxmlXXX);

b在res/xml、res/raw目录下:

[java] view plaincopy

InputStream inputStream = thisgetResources()openRawResource(RxmlXXX);

c在assets文件夹下(本人测试发现通过此方法获取的XML文档不能带有首行:<xml version="10" encoding="utf-8">,否则解析报错,具体原因未查明,知道原因请回复交流):

[java] view plaincopy

InputStream inputStream = getResources()getAssets()open(fileName);

d在应用指定目录下(SDcard,应用data目录等):

[java] view plaincopy

// path路径根据实际项目修改,此次获取SDcard根目录

String path = EnvironmentgetExternalStorageDirectory()toString();

File xmlFlie = new File(path+fileName);

InputStream inputStream = new FileInputStream(xmlFlie);

2、通过url得到的xml文件

很多时候需要解析xml文件都用于客户端与服务器之间的数据交互,比如解析google天气预报信息,或自己项目内定的一些XML数据结构,其中通过URL,使用Default>

OceanBase实现extractvalue函数解析XML的原理如下:

1 将XML文档转换为DOM树。

2 根据XPath表达式获取需要提取的节点

3 将节点的值提取出来。

4 返回提取的值。

具体实现步骤如下:

1 将XML文档转换为DOM树:

OceanBase中使用了第三方库libxml2来解析XML文档,可以将XML文档解析为DOM树。

2 根据XPath表达式获取需要提取的节点:

XPath是用来在XML文档中定位节点的语言。OceanBase使用了XPath语言,通过XPath表达式可以在DOM树中定位到需要提取的节点。

3 将节点的值提取出来:

在定位到需要提取的节点之后,使用libxml2提供的API函数获取节点的值。

4 返回提取的值:

将提取的值返回给调用extractvalue函数的程序。

需要注意的是,如果XPath表达式无法定位到节点,则extractvalue函数返回NULL。如果节点的值为空,则extractvalue函数返回空字符串。

组态王是一款可视化工控软件,其主要用途是通过图形化界面实现各种控制、监控和数据处理等功能。如果您需要在组态王中显示实时天气,可以按照以下步骤进行设置:

1 获取天气数据源:首先需要从一个可靠的天气数据源获取实时的天气信息。您可以从各大天气服务提供商或者气象局的网站上获取相关数据,例如温度、湿度、风力、降雨量等。一般这些服务提供商都会有相关的API接口,您可以通过API访问天气数据。

2 解析数据格式:获取到天气数据后,需要将数据解析成组态王所支持的格式。常见的数据格式包括XML、JSON、CSV等。您可以使用Python等编程语言进行数据格式转换,并将转换后的数据写入到组态王支持的数据库中。

3 在组态王中添加控件:在组态王中添加控件,例如文本框、曲线图等来显示天气数据。您可以根据需要自定义控件的大小、颜色和字体等,以及添加动态效果和声音提示。具体 *** 作方式请参考组态王的帮助文档和教程。

4 绑定数据源:最后一步是将天气数据绑定到相应的控件上,实现数据的实时显示。在组态王中,您可以使用数据绑定功能,将数据源和控件进行绑定,以自动更新控件中的数据。具体 *** 作方式请参考组态王的帮助文档和教程。

需要注意的是,在使用天气数据时,您需要遵循相关规定和条款,并且确保数据的准确性和可靠性。同时,在绑定数据时,需要注意控件类型和数据类型的匹配,以避免出现错误和异常。

首先将省市信息以的形式保存到名为arraysxml的文件中(我记得貌似一定要把文件名取为arraysxml)。其中,name属性可以理解为数组名和ID名。这里要注意:省份的顺序要与对应拥有的城市顺序一致。即台湾为最后最后一个省,

在选择城市界面对应的Activity中,通过下面代码将省份列表显示。其中Rarrayprovinces就是我们上面定义的name属性值。

ArrayAdapter adapter =

ArrayAdaptercreateFromResource(this,Rarrayprovinces,androidRlayoutsimple_spinner_item);

provinceSpinnersetAdapter(adapter);

接着,对省份下拉列表进行监听。这里有一个比较麻烦的地方,因为当你选择不同的省份的时候,需要显示该省份对应的城市。面对那么多的省份,如果我们通过if或者switch来 *** 作的话,使得代码很冗长,也难以维护。发现这里是通过Rarrayname这种形式来显示下拉列内容的。通过观察R文件,发现了一定的规律。R文件中的array类的int属性值,是根据写入顺序,从0x7f050000开始,逐个+1形成的。即

public static final int provinces=0x7f050000;

public static final int beijing_array=0x7f050001;

public static final int tianjin_array=0x7f050002;

可能R文件中没有按照此顺序排列,不过,不影响这一性质。所以我就想到了只要城市数组的顺序与省份一一对应(上面提到过),就可以通过所选省份的position,跟ID初始值

0x7f050000相加,得出所属城市的数组。具体看看代码

provinceSpinnersetOnItemSelectedListener(new OnItemSelectedListener()

{

public void onItemSelected(AdapterView parent, View view,

int position, long id) {

if(position != 0){//选择了省份,position=0时,为“--请选择--”

0x7f050000为R文件中省份数组对应的id值,只要加上position,即可获得对应选项(省份)的城市

/

int cityID = 0x7f050000 + position;

ArrayAdapter adapter =

ArrayAdaptercreateFromResource(getApplicationContext(), cityID,

androidRlayoutsimple_spinner_item);

citySpinnersetAdapter(adapter);

}

}

public void onNothingSelected(AdapterView parent) {

}

});

二。

三、SQLite保存城市数据

使用SQLite而不使用Intent传递参数,是因为当用户下次打开程序时,当前城市应该为TA最后一次的选择。关于SQLite的使用,网上有很多文章,比如:52androidblog51ctocom/2554429/478368

之前也学习过一些,但四、PreferenceActivity作为设置界面

参照Android系统的设置,用PreferenceActivity来对系统进行信息配置和管理。这里我也采用PreferenceActivity作为设置界面。(上方图三)

首先,编写xml文件。PreferenceCategory:类别(用于分组)。key:唯一标识(获取信息时使用)。title:显示标题。summary:小标题。还有defaultValue:默认值。我这里值用到了CheckBoxPreference,它还有EditTextPreperence,RingtonePreference,ListPreference,Preference等。

schemasandroidcom/apk/res/android" >

android:key="threeDay"

android:summary="今明后三天的天气预报,如果不选,则只有当天的天气"

android:title="三天预报" />

android:key="cityInfo"

android:summary="关于当前城市的简要介绍"

android:title="城市简介" />

然后,新建Activity继承 PreferenceActivity

,重写onCreate方法,通过addPreferencesFromResource(Rxmlxx); 加载Preference。

public class SetupActivity extends PreferenceActivity {

@Override

protected void onCreate(Bundle savedInstanceState) {

superonCreate(savedInstanceState);

addPreferencesFromResource(Rxmlsetup);

}

}

最后,获取preference数据。可 通过下面三种方式:

1、getPreferences():可以获取同一activity中的preference;

2、getSharedPreferences():可以获取应用级别的preferences,即封装在同一app中,使用SharePreferences

prefs = getSharedPreferences(packName+name ,0)

3、getDefaultSharedPreferences():通过Android的管理器来获取其所管理的preferences。

由于这里不是同一个Activity,所以不能使用getPreferences()。我这里只有一个preference,因此使用PreferenceManagergetDefaultSharedPreferences(this);来获取较方便。

五、通过WebService获取天气信息

WebService获取天气的网址为:webxmlcomcn/webservices/weatherwebserviceasmx上面

// 保存获取到的信息

SoapObject detail = null;

// 1实例化SoapObject对象

SoapObject soapObject = new SoapObject(NAMESPACE, METHOD_NAME);

// 2如果方法需要参数,设置参数

soapObjectaddProperty("theCityName", cityName);

// 3设置Soap的请求信息,获得序列化envelope,参数部分为Soap协议的版本号

SoapSerializationEnvelope envelope = new SoapSerializationEnvelope(

SoapEnvelopeVER11);

envelopebodyOut = soapObject;

envelopedotNet = true;

envelopesetOutputSoapObject(soapObject);

// 4构建传输对象

int timeout = 10000;// 设置超时为10秒

MyAndroid>

实现思路:可以通过w3c的dom解析器进行 *** 作,之后通过getName获取到xmltpye中的属性值。

举例:

import javaioFile;

import javaxxmlparsersDocumentBuilder;

import javaxxmlparsersDocumentBuilderFactory;

import orgw3cdomDocument;

import orgw3cdomElement;

import orgw3cdomNodeList;

public class DomTest1

{

public static void main(String[] args) throws Exception

{

// step 1: 获得dom解析器工厂(工作的作用是用于创建具体的解析器)

DocumentBuilderFactory dbf = DocumentBuilderFactorynewInstance();

// Systemoutprintln("class name: " + dbfgetClass()getName());

// step 2:获得具体的dom解析器

DocumentBuilder db = dbfnewDocumentBuilder();

// Systemoutprintln("class name: " + dbgetClass()getName());

// step3: 解析一个xml文档,获得Document对象(根结点)

Document document = dbparse(new File("candidatexml"));

NodeList list = documentgetElementsByTagName("PERSON");

for(int i = 0; i < listgetLength(); i++)

{

Element element = (Element)listitem(i);

String content = elementgetElementsByTagName("NAME")item(0)getFirstChild()getNodeValue();

Systemoutprintln("name:" + content);

Systemoutprintln("--------------------------------------");

}

}

}

如果获取到节点话,就调用attributeValue(String name)方法获取里面的值就好了。

$cat testsh

#!/bin/bash

if [ -z $1 ];then

echo 'USAGE:COMMAND FILENAME'

exit 0

fi

filename=recordtxt

HOST=(`sed -n 's/>\(\)<\/host>/\1/p' $1`)

OIDG=(`sed -n 's/>\(\)<\/oidgroupname>/\1/p' $1`)

COMM=(`sed -n 's/>\(\)<\/communitystring>/\1/p' $1`)

DESC=(`sed -n 's/>\(\)<\/description>/\1/p' $1`)

FILE=(`ls -l $filename >/dev/null 2>&1 | awk '{print $8}'`)

if [ ! -z $FILE ];then

echo -e "host\t\toidgroupname\t\tcomm\t\tdesc" >$filename

fi

for((i=0;i<${#HOST[@]};i++));do

echo -e "${HOST[i]}\t${OIDG[i]}\t${COMM[i]}\t\t${DESC[i]}" >>$filename

done

$/testsh file

$cat recordtxt

host oidgroupname comm desc

19216811 CpuUtilization_MF public 19216811_CPUUtilizaton

19216812 CpuUtilization_MF public 19216812_CPUUtilizaton

19216813 CpuUtilization_MF public 19216813_CPUUtilizaton

19216814 CpuUtilization_MF public 19216814_CPUUtilizaton

19216815 CpuUtilization_MF public 19216815_CPUUtilizaton

以上就是关于新手使用android的XML(DOM)解析问题,指定路径XML如何读取全部的内容,包括:新手使用android的XML(DOM)解析问题,指定路径XML如何读取、CISCO的IP电话要通过XML来显示天气预报、oceanbase 如何实现extractvalue函数解析xml等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9617896.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-30
下一篇 2023-04-30

发表评论

登录后才能评论

评论列表(0条)

保存