Android solo se permite un elemento raíz. error xml

¿Por qué siempre recibo este error? Estoy tratando de agregar datos al archivo xml existente. Leí aquí la respuesta y probé lo que se sugirió. Pero aún no tuve éxito. Sé que este error significa que el elemento raíz superior solo puede aparecer una vez. Pero no sé por qué recibo este error.

Esta será la estructura de mi archivo xml.

<root>
  <ip>ip1</ip>
  <ip>ip2</ip>
</root>

Y la etiqueta ip seguirá aumentando. Así es como intento leer y agregar datos al archivo existente.

private void UpdateExistingXML(String ip,File file) 
{
    try
    {
        DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
        Document doc = docBuilder.parse(file.toURI().toString());   // <--error here

        // Get the root element
        Node root= doc.getFirstChild(); 
        org.w3c.dom.Element newip=doc.createElement("ip");
        newip.appendChild(doc.createTextNode(ip));
        root.appendChild(newip);
        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(doc);
        StreamResult result = new StreamResult(file);
        transformer.transform(source, result);
    }
    catch (ParserConfigurationException pce)
    {
            pce.printStackTrace();
    }
    catch (TransformerException tfe) 
    {
            tfe.printStackTrace();
    }
    catch (IOException ioe) 
    {
            ioe.printStackTrace();
    }
    catch (SAXException sae) 
    {
            sae.printStackTrace();
    }
    catch (Exception e)
    {
        Log.e("eeee",e.getMessage());
    }
}

Así es como estoy creando el archivo xml por primera vez que muestra que el elemento raíz solo se inserta una vez.

private void CreateNewXML(String ip) throws FileNotFoundException
{
    FileOutputStream fos=null ;

    Log.i("Fileeee","new");
    try
    {
        fos = openFileOutput("clients.xml", Context.MODE_PRIVATE);
    }
    catch(FileNotFoundException e)
    {
            Log.e("FileNotFoundException", "can't create FileOutputStream");
    }
    XmlSerializer serializer = Xml.newSerializer();
    try {
                    serializer.setOutput(fos, "UTF-8");
                    serializer.startDocument(null, Boolean.valueOf(true));
                    serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
                    serializer.startTag(null, "root");

                            serializer.startTag(null, "ip");
                            serializer.text(ip);
                            serializer.endTag(null, "ip");

                    serializer.endTag(null, "root");
                    serializer.endDocument();
                    serializer.flush();
                    fos.close();

            } 
    catch (Exception e) 
    {
                    Log.e("Exceptionhaiiiiiiiiiii",e.getMessage());
    }
}

preguntado el 27 de julio de 12 a las 19:07

¿Puedes publicar el registro de errores y/o logcat?

1 Respuestas

Este parece ser tu problema:

Document doc = docBuilder.parse(file.toURI().toString());   // <--error here

Está intentando analizar la ruta del archivo, en lugar del archivo. Necesitas crear un inputStream y analizar eso.

Si está obteniendo el archivo de un servidor web, podría verse así:

URL url = new URL(DATAURL);
            conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(TIMEOUT);
            conn.setConnectTimeout(CONNECT_TIMEOUT);
            conn.setRequestMethod("GET");
            conn.setDoInput(true);
            conn.connect();

DocumentBuilderFactory builderFactory =
            DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = null;

        try
        {

            builder = builderFactory.newDocumentBuilder();
        }
        catch (ParserConfigurationException e)
        {
            Log.e(TAG, "Parse Configuration issue", e);
            throw new ServiceException("Service Exception Error");
        }
        catch (IllegalAccessError e)
        {
            Log.e(TAG, "Illegal Accessor Error", e);
            throw new ServiceException("Service Exception Error");
        }

        try
        {
            // parse input from server
            Document document = builder.parse(conn.getInputStream());
            Element xmlElement = document.getDocumentElement();
            NodeList recordNodes = xmlElement.getChildNodes();

            // assign parsed data to listItem object
            for (int i = 0; i < recordNodes.getLength(); i++)
            {

                Node record = recordNodes.item(i);
                NodeList recordDetails = record.getChildNodes();
                ListData listItem = new ListData();

                for (int ii = 0; ii < recordDetails.getLength(); ii++)
                {
                    Node detailItem = recordDetails.item(ii);
                    String detailType = detailItem.getNodeName();
                    String detailValue = detailItem.getTextContent();
.....

Respondido 27 Jul 12, 21:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.