2017-07-28 74 views
1

我必须解析此XML https://i.imgur.com/GUAHB4t.jpg以提取“DetailPageURL”标记下的突出显示的字符串。我做了一个尝试,但有很混乱的想法。我正在开发Android SDK使用Android和Java解析XML

import android.os.AsyncTask; 

import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.NodeList; 
import org.xml.sax.SAXException; 

import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 


public class ReflinkFetcher extends AsyncTask<String, Void, String> { 

String refLink = null; 

@Override 
protected String doInBackground(String... url){ 
    Document doc = openXML(url[0]); 
    Element rootElement = doc.getDocumentElement(); 
    refLink = getString("DetailPageUrl", rootElement); 
    return refLink; 
} 


public String getRefLink(){ 
    return refLink; 
} 

private Document openXML(String url) { 
    Document doc = null; 
    try { 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     doc = db.parse(new URL(url).openStream()); 
    } catch (SAXException e1) { 
     e1.printStackTrace(); 
    } catch (ParserConfigurationException e1) { 
     e1.printStackTrace(); 
    } catch (MalformedURLException e2) { 
     e2.printStackTrace(); 
    } catch (IOException e3) { 
     e3.printStackTrace(); 
    } 
    return doc; 
} 

private String getString(String tagName, Element element) { 
    NodeList list = element.getElementsByTagName("Items"); 
    if (list != null && list.getLength() > 0) { 
     NodeList subList = list.item(0).getChildNodes(); //0=items 
     if (subList != null && subList.getLength() > 0) { 
      subList = subList.item(4).getChildNodes(); //4=item 
      if(subList != null && subList.getLength() >0) { 
       subList = subList.item(2).getChildNodes(); //2=DetailPageURL 
       if(subList != null && subList.getLength() >0) { 
        return subList.item(0).getNodeValue(); // Value?? 
       } 

      } 
     } 
    } 
    return null; 
} 

} 

最终返回null正在执行。我认为“getString”方法也很差。我该如何改进它?

+0

我建议您阅读有关Retrofit和简单的XML转换器 – DeKaNszn

+0

这个普通的问题已经回答了许多其他时间 - 例如, https://stackoverflow.com/questions/340787/parsing-xml-with-xpath-in-java 那里给出的解决方案使用XPath,我认为这将是解决这个特定问题的理想解决方案。 – Squiggle

+0

[在Java中使用XPath解析XML]可能的副本(https://stackoverflow.com/questions/340787/parsing-xml-with-xpath-in-java) – Squiggle

回答

0

检查这个不错的开源库,你需要的只是nice XML parser

+0

它看起来像个好主意。然而,如果我有一个指向XML文件的远程URL呢?有没有比在org.w3c.Document中获取xml更好的想法,并将它转换为String来与您链接的解析器一起使用? – Alessandro