从资源中解析XML文件

时间:2013-12-23 13:09:37

标签: java android xml exception

我正在尝试从Resources解析XML文件。解析完文件后,我打算在其上执行一些XPATH函数。

我的代码是:

Resources res = getResources();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
DocumentBuilder builder = null;
Document doc = null;
XPathExpression expr = null;

    try {
        builder = factory.newDocumentBuilder();
    } catch (ParserConfigurationException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }

    try {
        doc = builder.parse(res.getResourceName(R.xml.cdatest01));
    } catch (NotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (SAXException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }  

调试代码时,会在parse语句中抛出IOException错误。 logcat将错误显示为

java.net.MalformedURLException: unknown protocol: com.apps4care.mycarerecord

关于我做错了什么的任何线索......

3 个答案:

答案 0 :(得分:2)

您正在尝试将完整的资源名称从Resources.getResourceName传递到需要URI字符串的DocumentBuilder.parse。这些不是一回事。

这就是你得到MalformedURLException

的原因

您可以通过多种方式做到这一点,包括:

  1. 调用DocumentBuilder.parse的变体,该变体采用InputStream并使用res.openRawResource代替。这可能是一个较小的变化。
  2. 使用Resources.getXml取回XML pull解析器并使用它而不是使用DOM API来解析XML。

答案 1 :(得分:0)

尝试

InputStream fIn = getResources().openRawResource(R.raw.hot);
Document doc=builder.parse(fIn);

答案 2 :(得分:-1)

请尝试使用我正在运行的代码....

    try {

        File fXmlFile = new File("/root/Desktop/staff.xml");
        DocumentBuilderFactory dbFactory = DocumentBuilderFactory
                .newInstance();
        DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
        Document doc = dBuilder.parse(fXmlFile);

        // optional, but recommended
        // read this -
        // http://stackoverflow.com/questions/13786607/normalization-in-dom-parsing-with-java-how-does-it-work
        doc.getDocumentElement().normalize();

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

        NodeList nList = doc.getElementsByTagName("staff");

        System.out.println("----------------------------");

        for (int temp = 0; temp < nList.getLength(); temp++) {

            Node nNode = nList.item(temp);

            System.out.println("\nCurrent Element :" + nNode.getNodeName());

            if (nNode.getNodeType() == Node.ELEMENT_NODE) {

                Element eElement = (Element) nNode;

                System.out.println("Staff id : "
                        + eElement.getAttribute("id"));
                System.out.println("First Name : "
                        + eElement.getElementsByTagName("firstname")
                                .item(0).getTextContent());
                System.out.println("Last Name : "
                        + eElement.getElementsByTagName("lastname").item(0)
                                .getTextContent());
                System.out.println("Nick Name : "
                        + eElement.getElementsByTagName("nickname").item(0)
                                .getTextContent());
                System.out.println("Salary : "
                        + eElement.getElementsByTagName("salary").item(0)
                                .getTextContent());

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