【问题标题】:parsing XML from URL in java从java中的URL解析XML
【发布时间】:2016-12-18 15:56:43
【问题描述】:

你好,我有一个大问题。我必须从 URL/HTTP 解析 XML 文件并在 java 中处理它,但是当我这样做时总是会出现异常。地址没问题,因为它是一家银行的 www。请帮帮我

import java.net.URL;

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

import org.w3c.dom.Document;

public class MainClass {
public static void main(String [] args){
    String url = "http://api.nbp.pl/api/exchangerates/rates/c/gbp/2015-01-01/2015-01-31";   
    try
    {
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(new URL(url).openStream());

        doc.getDocumentElement().normalize();
        System.out.println ("Root element: " + 
                    doc.getDocumentElement().getNodeName());

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

错误:

[致命错误]:1:1:序言中不允许内容。 org.xml.sax.SAXParseException;行号:1;列号:1;内容 在序言中是不允许的。在 com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(未知 来源)在 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(未知 来源)在 javax.xml.parsers.DocumentBuilder.parse(未知来源) 在 pl.parser.nbp.MainClass.main(MainClass.java:17)

第二种情况:

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

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class MainClass {
public static void main(String [] args){
    String url = "http://api.nbp.pl/api/exchangerates/rates/a/gbp/2012-01-01/2012-01-31/";   
    try
    {
        DocumentBuilderFactory f = 
                DocumentBuilderFactory.newInstance();
        DocumentBuilder b = f.newDocumentBuilder();
        Document doc = b.parse(url);

        doc.getDocumentElement().normalize();
        System.out.println ("Root element: " + 
                    doc.getDocumentElement().getNodeName());

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

错误:

[致命错误]:1:1:序言中不允许内容。 org.xml.sax.SAXParseException;系统标识: http://api.nbp.pl/api/exchangerates/rates/a/gbp/2012-01-01/2012-01-31/; 行号:1;列号:1;序言中不能有内容。在 com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(未知 来源)在 com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(未知 来源)在 javax.xml.parsers.DocumentBuilder.parse(未知来源) 在 pl.parser.nbp.MainClass.main(MainClass.java:19)

【问题讨论】:

    标签: java xml


    【解决方案1】:

    问题是直接从URL读取,网站会返回json格式的数据。你需要打开URL,请求xml

    public static void main(String [] args){
        String url = "http://api.nbp.pl/api/exchangerates/rates/a/gbp/2012-01-01/2012-01-31/";
        DocumentBuilderFactory f = DocumentBuilderFactory.newInstance();
        f.setNamespaceAware(false);
        f.setValidating(false);
        DocumentBuilder b = f.newDocumentBuilder();
        URLConnection urlConnection = new URL(url).openConnection();
        urlConnection.addRequestProperty("Accept", "application/xml");
        Document doc = b.parse(urlConnection.getInputStream());
        doc.getDocumentElement().normalize();
        System.out.println ("Root element: " +  doc.getDocumentElement().getNodeName());
    }
    

    这将打印出来

    Root element: ExchangeRatesSeries
    

    【讨论】:

      【解决方案2】:

      默认情况下,URL 以 JSON 格式返回数据。您会在浏览器中看到 XML,因为浏览器协商返回类型的方式(通过 Accept 标头)。

      您可以将数据解析为 JSON,或将 URL 更改为 http://api.nbp.pl/api/exchangerates/rates/c/gbp/2015-01-01/2015-01-31?format=xml

      最后通知?format=xml

      请参阅User manual

      【讨论】:

      • 非常感谢你救了我的命!!你太棒了!!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-12
      • 2013-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-05
      相关资源
      最近更新 更多