在Android应用程序中解析XML文件
我正在创建一个Android应用程序。在这里,我通过解析存储在手机中的XML文件来显示结果。但是解析XMl文件需要一分钟以上的时间 因此,我已经实现了AsyncTask功能,但仍然需要一分钟以上的时间 如果我作为Java应用程序运行来解析XML,同样的代码需要3-5秒来解析完整的XML并打印数据 解析代码在Android应用程序中解析XML文件,android,android-asynctask,Android,Android Asynctask,我正在创建一个Android应用程序。在这里,我通过解析存储在手机中的XML文件来显示结果。但是解析XMl文件需要一分钟以上的时间 因此,我已经实现了AsyncTask功能,但仍然需要一分钟以上的时间 如果我作为Java应用程序运行来解析XML,同样的代码需要3-5秒来解析完整的XML并打印数据 解析代码 public class ParseMyTripResponseXML { String aprovedStatus=""; SetFlightRecordsData objF
public class ParseMyTripResponseXML {
String aprovedStatus="";
SetFlightRecordsData objFlight;
public MyTripRespone parseMyTripXML(File filename) {
MyTripRespone respObj = new MyTripRespone();
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = null;
CorporateBookingApprovals corpApprovalObj = null;
List<CorporateBookingApprovals> corpApprovalList = new ArrayList<CorporateBookingApprovals>();
try {
dBuilder = dbFactory.newDocumentBuilder();
}
catch (ParserConfigurationException e) {
e.printStackTrace();
}
Document doc = null;
try {
doc = dBuilder.parse(filename);
}
catch (SAXException e) {
Log.d("SAXException", e.getMessage()+"");
}
catch (IOException e) {
Log.d("IOException", e.getMessage()+"");
}
doc.getDocumentElement().normalize();
Node rootNode = doc.getElementsByTagName("Root").item(0);
Element rootElement = (Element) rootNode;
String status = getTagValue("StatusCode", rootElement);
if (status.equals("200")) {
NodeList corpList = ((Element) doc.getElementsByTagName("Result").item(0)).getElementsByTagName("CorporateBookingApprovals");
for (int i = 0; i < corpList.getLength(); i++) {
try {
Node corporateDetailsNode = corpList.item(i);
Element corporateDetailsElement = (Element) corporateDetailsNode;
corpApprovalObj = new CorporateBookingApprovals();
corpApprovalObj.setApprovalId(getTagValue("ApprovalId", corporateDetailsElement));
corpApprovalObj.setAgentId(getTagValue("AgentId", corporateDetailsElement));
String statusApproval = getTagValue("ApprovalStatus", corporateDetailsElement);
if(statusApproval.equals("approved")){
aprovedStatus = "A";
}else if (statusApproval.equals("pending")) {
aprovedStatus = "P";
}
else if (statusApproval.equals("inqueue")) {
aprovedStatus = "Q";
}
else if (statusApproval.equals("rejected")) {
aprovedStatus = "R";
}
corpApprovalObj.setApprovalStatus(aprovedStatus);
corpApprovalObj.setInsertTime(getTagValue("InsertTime", corporateDetailsElement));
objFlight = new SetFlightRecordsData();
objFlight.setFlightData(doc, corpApprovalObj);
corpApprovalList.add(corpApprovalObj);
}
catch (Exception e) {
Log.d("exception in main", e.getMessage()+"");
continue;
}
}
respObj.setCoroprateBookingDetails(corpApprovalList);
}
return respObj;
}
public static String getTagValue(String sTag, Element eElement) {
NodeList nlList = eElement.getElementsByTagName(sTag).item(0)
.getChildNodes();
Node nValue = (Node) nlList.item(0);
if (nValue == null) {
return "";
}
else {
return nValue.getNodeValue();
}
}
公共类ParseMyTripResponseXML{
字符串aprovedStatus=“”;
设置飞行记录数据objFlight;
公共MyTripRespone parseMyTripXML(文件名){
MyTripRespone respObj=新的MyTripRespone();
DocumentBuilderFactory dbFactory=DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder=null;
CorporateBookingApprovalobj=null;
List corpaprovallist=new ArrayList();
试一试{
dBuilder=dbFactory.newDocumentBuilder();
}
捕获(ParserConfiguration异常e){
e、 printStackTrace();
}
单据单据=空;
试一试{
doc=dBuilder.parse(文件名);
}
捕获(SAXE异常){
Log.d(“SAXException”,e.getMessage()+”);
}
捕获(IOE异常){
Log.d(“IOException”,例如getMessage()+);
}
doc.getDocumentElement().normalize();
Node rootNode=doc.getElementsByTagName(“根”)。项(0);
元素rootElement=(元素)rootNode;
String status=getTagValue(“StatusCode”,rootElement);
如果(状态等于(“200”)){
NodeList corpList=((元素)doc.getElementsByTagName(“结果”).item(0)).getElementsByTagName(“公司图书批准”);
对于(int i=0;i
我如何使它更快
我使用的是DOM解析器。我建议通过添加计时器函数和消除过程,注释掉部分并重新运行,从而准确地知道是什么导致了您的速度减慢。通常的怀疑是对象创建调用和字符串处理
long startTime;
long endTime;
startTime = android.os.SystemClock.uptimeMillis();
// parse routine here
endTime = android.os.SystemClock.uptimeMillis();
Log.d("xmlparse", "Excution time: "+(endTime-startTime)+" ms");
发布您的代码以解析XML。您是否也在其他一些设备中检查了相同的过程。因为这也取决于设备的功能。@LawrenceChoy更新了我的代码XML文件有多大?请记住,尽管移动设备在RAM大小和CPU速度方面都越来越接近台式计算机,但它们仍然非常复杂低。我不是专家,但是如果文件足够大,Android就不能把它全部装入内存(但是桌面计算机会)。如果是这样,那么顺序文件IO操作会影响你的性能。总之,除了代码优化之外,还有很多其他因素需要考虑(这也是重要的)。@Losiowaty文件大小为1.06MB