Cambiar el nombre del nodo raíz de XML (con prefijo de espacio de nombres) en Java

Estoy tratando de usar el método renameNode () de la clase org.w3c.dom.Document para cambiar el nombre del nodo raíz de un documento XML.

Mi código es similar a esto:

xml.renameNode(Element, "http://newnamespaceURI", "NewRootNodeName");

El código cambia el nombre del elemento raíz pero no aplica el prefijo del espacio de nombres. La codificación rígida del prefijo del espacio de nombres no funcionaría, ya que tiene que ser dinámica.

¿Alguna idea de por qué no funciona?

Muchas gracias

Respuesta 1

Lo probé con JDK 6:

public static void main(String[] args) throws Exception {
  // Create an empty XML document
  Document xml = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

  // Create the root node with a namespace
  Element root = xml.createElementNS("http://oldns", "doc-root");
  xml.appendChild(root);

  // Add two child nodes. One with the root namespace and one with another ns    
  root.appendChild(xml.createElementNS("http://oldns", "child-node-1"));
  root.appendChild(xml.createElementNS("http://other-ns", "child-node-2"));

  // Serialize the document
  System.out.println(serializeXml(xml));

  // Rename the root node
  xml.renameNode(root, "http://new-ns", "new-root");

  // Serialize the document
  System.out.println(serializeXml(xml));
}

/*
 * Helper function to serialize a XML document.
 */
private static String serializeXml(Document doc) throws Exception {
  Transformer transformer = TransformerFactory.newInstance().newTransformer();
  Source source = new DOMSource(doc.getDocumentElement());
  StringWriter out = new StringWriter();
  Result result = new StreamResult(out);
  transformer.transform(source, result);
  return out.toString();
}

El resultado es (formato agregado por mí):

<doc-root xmlns="http://oldns">
  <child-node-1/>
  <child-node-2 xmlns="http://other-ns"/>
</doc-root>

<new-root xmlns="http://new-ns">
  <child-node-1 xmlns="http://oldns"/>
  <child-node-2 xmlns="http://other-ns"/>
</new-root>

Entonces funciona como se esperaba. El nodo raíz tiene un nuevo nombre local y un nuevo espacio de nombres, mientras que los nodos secundarios siguen siendo los mismos, incluidos sus espacios de nombres.

Respuesta: 2

Así que estoy haciendo una aplicación para mi Xoom, comenzando con el desarrollo de Android. Hice algunos botones y todo ese jazz, usando el ADT en eclipse para colocar todo (usando la configuración de la tableta WXGA 10.1) ...

Tenemos una colección de objetos, cada objeto tiene una ID entera y una marca de tiempo. Queremos poder buscar duplicados y actualizar la colección en función de la ID. Pero también queremos poder ...

Estoy tratando de buscar un tweet utilizando el método de búsqueda en twitter4j con efectos similares a este sitio web: Monitter.com Al igual que este sitio web, quiero mostrar un tweets en actualizaciones de twitter en tiempo real. Yo solo ...

inputStream público getResourceAsStream (Class className, String name) {InputStream in = null; in = className.getClassLoader (). getResourceAsStream (name); volver en } ...