2016-08-18 61 views
-1

我需要编写一个简单的函数来解析xml从Java的URL与DOM。 这是xml url如何从URL读取XML响应?

如果我把它写入/assets/exampleXML.xml并使用这段代码都可以。

static final String NODE_EMP = "Record"; 
static final String NODE_NAME = "Nominal"; 
static final String NODE_SALARY = "Value"; 
..... 
public void onBtnClick3(View v) { 
    XMLDOMParser parser = new XMLDOMParser(); 
    try { 
     InputStream is = getAssets().open("exampleXML2.xml"); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(is); 
     NodeList nodeList = doc.getElementsByTagName(NODE_EMP); 
     for (int i = 0; i < nodeList.getLength(); i++) { 
      Element e = (Element) nodeList.item(i); 
      nameText.append(parser.getValue(e, NODE_NAME) + "\n"); 
      nameText.append(parser.getValue(e, NODE_SALARY) + "\n"); 
     } 

但是,如果我改变

public static final String QUERY_URL = "http://www.cbr.ru/scripts/XML_dynamic.asp?......"; 

public void onBtnClick(View v) { 
    XMLDOMParser parser = new XMLDOMParser(); 
    try { 
     URL url = new URL(QUERY_URL); 
     URLConnection conn = url.openConnection(); 
     DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
     DocumentBuilder db = dbf.newDocumentBuilder(); 
     Document doc = db.parse(conn.getInputStream()); 

这是行不通的。什么是问题以及如何解决它? 我已阅读它,但它不起作用。请帮帮我。 How to read XML response from a URL in java?

回答

0

我并不喜欢手工解析XML,我通常使用POJO和简单的XML来为我完成这项工作。下面是一个使用Volley为HTTP通信和Simple XML

的POJO

@org.simpleframework.xml.Root(name="ValCurs", strict=false) 
class ValCurs { 

    @Attribute(name="ID") public String id; 
    @Attribute(name="DateRange1") public String dateRange1; 
    @Attribute(name="DateRange2") public String dateRange2; 
    @Attribute public String name; 

    @ElementList(inline = true) 
    public List<Record> records; 

    public ValCurs() { 
     id = ""; 
     name = ""; 
     dateRange1 = ""; 
     dateRange2 = ""; 
     records = new ArrayList<Record>(); 

    } 
} 

@Root(name="Record") 
class Record { 
    @Attribute(name="Date") public String date; 
    @Attribute(name="Id") public String id; 
    @Element(name="Nominal") public String nominal; 
    @Element(name="Value") public String value; 

    public Record() { 
     date = ""; 
     id = ""; 
     nominal = ""; 
     value = ""; 
    } 
} 

的单元测试

@Test 
    public void XMLTest() throws Exception { 

     final CountDownLatch unitTestLatch = new CountDownLatch(1); 
     String url = "http://www.cbr.ru/scripts/XML_dynamic.asp?VAL_NM_RQ=R&date_req1=01.08.2016&date_req2=18.08.2016&rt=1&mode=1[1]"; 

     Context appContext = InstrumentationRegistry.getTargetContext(); 
     RequestQueue queue = Volley.newRequestQueue(appContext); 

     StringRequest stringRequest = new StringRequest(Request.Method.GET, url, 
       new Response.Listener<String>() { 
        @Override 
        public void onResponse(String response) { 

         try { 
          Serializer serializer = new Persister(); 
          ValCurs valcur = serializer.read(ValCurs.class, new StringReader(response), false); 
          Log.d("TAG", "Record size: " + valcur.records.size()); 

         } catch (Exception e) { 
          e.printStackTrace(); 
         } 

         unitTestLatch.countDown(); 
        } 
       }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       unitTestLatch.countDown(); 
      } 
     }); 

     queue.add(stringRequest); 

     unitTestLatch.await(); 
    } 
一个例子