JDOM FAQ Spanish Translation


Original article: http://jdom.org/docs/faq.html

        ⚫ ¿Qué es JDOM?

        ⚫ ¿Qué es JDOM not?

        ⚫ ¿Es JDOM un acrónimo?

        ⚫ ¿Cuál es la licencia JDOM?

        ⚫ ¿Dónde puedo obtener JDOM?

        ⚫ ¿Qué artefacto de Maven debo usar?

        ⚫ ¿Qué JDOM Filosofía?

        ⚫ ¿Por qué se ha definido el API JDOM en los términos de clases concretas en lugar de las interfaces?

        ⚫ ¿Cómo funciona JDOM con DOM y SAX?

        ⚫ ¿Si JDOM es diseñado para los genéricos?

        ⚫ Traté de usar JDOM y obtuve un error como este: java.lang.NoSuchMethodError o java.lang.NoClassDefFoundError: org / xml / sax / SAXNotRecognizedException

        ⚫ ¿Qué quiere decir "el directorio de la extensión estándar"?

        ⚫ ¿Cómo puedo evitar el problema DOM Nivel 1 en el programa Visual Age for Java?

        ⚫ ¿Cómo puedo evitar el problema DOM Nivel 1 en WebSphere?

        ⚫ ¿Qué versión JDOM trabaja con cúal JDK?

        ⚫ ¿Hay cifras de rendimiento?

        ⚫ ¿Cómo se integra JDOM con XSLT?

        ⚫ ¿Hay apoyo XPath en JDOM?

        ⚫ ¿Qué características de XML no están completamente manejadas por JDOM?

        ⚫ ¿Si JDOM es seguro de usar?

        ⚫ ¿Por qué equals () sólo hacen un cheque ==?

        ⚫ ¿Por qué equals () se declara ser final?

        ⚫ ¿Cómo hago un documento a partir de String?

        ⚫ ¿Cómo se quita Element u otro contenido?

        ⚫ ¿Cómo puedo mover Element de un lugar a otro?

        ⚫ ¿Cómo puedo copiar Element de un lugar a otro?

        ⚫ ¿Si puede element o nombre de atributo contener dos puntos?

        ⚫ ¿Por qué tengo que pasar en Namespace para GetChild (), cuando el elemento secundario que estoy buscando no tiene la declaración de namespace?

        ⚫ Si dejo namespace de la segunda llamada a GetChild (), me devuelve null. ¿Por qué pasa así?

        ⚫ ¿Por qué aparecen todas las nuevas líneas como \ n, incluso en Windows?

        ⚫ ¿Por qué setText ("") no hace lo que quiero?

        ⚫ Cuando se utiliza un depurador IDE puedo ver un ArrayIndexOutOfBoundsException extraño. ¿Por qué lo veo?

        ⚫ ¿Cómo puedo añadir un IP o Comment antes del elemento raíz?

        ⚫ ¿Cómo puedo evitar contraer OutOfMemoryError?

        ⚫ ¿Por qué mi codificación del archivo de salida no coincide con la codificación de la entrada?

        ⚫ ¿Por qué un documento pasando a través de una toma a veces cuelga el analizador?

        ⚫ ¿Cómo puedo evitar el DTD de cargarlo? Incluso cuando apago la validación que el analizador intenta cargar el archivo DTD.

        ⚫ ¿Cómo valido con un esquema cuando se utiliza JDOM 2.x?

        ⚫ ¿Cómo valido con un esquema cuando se utiliza JDOM 1.x?

        ⚫ ¿Cómo puedo realizar la validación en memoria contra un DTD o esquema?

        ⚫ JDOM asegura siempre está bien formado el documento en la memoria. ¿Si puede JDOM también asegurar el documento en la memoria que siempre sea válido?

        ⚫ ¿Por qué recibo un IndexOutOfBoundsException o ConcurrentModificationException en bucle?

        ⚫ ¿Existe un archivo de las listas de correo JDOM?

        ⚫ ¿Cómo me doy de baja de una lista de correo?

        ⚫ ¿Cómo puedo enviar a la lista de correo desde múltiples direcciones?

        ⚫ ¿Si debo hacer preguntas generales XML a Jason, Brett, o Rolf?

        ⚫ El libro Java and XML trata de JDOM 1.0; ¿por qué ocurre la confusión?

        ⚫ Tengo una pregunta que no está respondida aquí. ¿Qué debo hacer?


        ⚫ ¿Cómo envío un informe de error?

        ⚫ ¿Dónde puedo obtener más información?

 

 

¿Qué es JDOM?

JDOM es simplemente una representación de Java de un documento XML. JDOM proporciona una forma de representar ese documento para la lectura fácil y eficiente y también la manipulación y la escritura. Tiene un API sencillo, es un peso ligero y rápido, y está optimizado para el programador Java. Es una alternativa a la DOM y SAX, aunque integra bien con DOM y SAX.

 

¿Qué es JDOM not?

JDOM not es un contenedor para DOM de la W3C u otra versión de DOM. JDOM es un "modelo de objeto de documento" basado en Java para archivos XML. JDOM sirve el mismo propósito que DOM, pero es más fácil de usar.

JDOM no es un analizador XML, como Xerces o Crimson. Se trata de un modelo de objetos de documento que utiliza analizadores XML para construir los documentos. Por ejemplo,Clase SAXBuilder de JDOM utiliza los eventos SAX generados por un analizador XML para construir un árbol de JDOM. El analizador XML por defecto utilizado por JDOM es el analizador JAXP-seleccionado, pero JDOM puede utilizar casi cualquier programa de análisis.

 

¿Es JDOM un acrónimo?

No. Al igual JDBC no es oficialmente un acrónimo, tampoco es JDOM. Esto asegura que cumplimos con las políticas de marcas comerciales de Sun como se explica en http://www.sun.com/policies/trademarks.

 

¿Qué es la licencia JDOM?

JDOM está disponible bajo una licencia de código abierto de estilo Apache, con la cláusula de reconocimiento eliminado. Esta licencia se encuentra entre la licencia menos restrictivo disponible, permitiendo a los desarrolladores utilizar JDOM en la creación de nuevos productos sin que tengan que liberar sus propios productos como código abierto. Este es el modelo de licencia utilizado por el proyecto Apache, que creó el servidor Apache. La licencia está disponible en la parte superior de cada archivo de origen y en LICENSE.txt en la raíz de la distribución.

 

¿Dónde puedo obtener JDOM?

JDOM está disponible en forma binaria y la fuente de http://www.jdom.org

JDOM también está disponible en el centro experto en el grupo 'org.jdom' con el artefacto de ID jdom para JDOM 1.x (y algunas versiones 2.x anteriores): Artefactos 1.x JDOM de maven, o con el artefacto de ID jdom2 para JDOM 2.x: JDOM Artefactos 2.x en maven

El repositorio de código fuente completo se mantiene en GitHub.

 

¿Qué artefacto Maven debo usar?

Todas las versiones JDOM están disponibles en el 'jdom' o artefacto 'jdom2' en el grupo org.jdom de Maven. Los artefactos Maven son un desastre con las primeras versiones 2.x JDOM que aparecen en los artefactos "JDOM", y versiones posteriores 2.x en el artefacto 'jdom2. Maven no permite la fijación de errores, por lo que los usuarios maven sólo tendrán que vivirla como es.

 

Si su proyecto es uno que requiere tanto 1.x JDOM y 2.x, a continuación, también puede utilizar el artefacto 'jdom-legacy' para tirar en la versión 1.1.3 (o versión posterior 1.x).

 

¿Qué es JDOM Filosofía?

JDOM ha sido y continuará siendo desarrollado con esta filosofía:

        ⚫ JDOM debe ser sencillo para los programadores de Java.

        ⚫ JDOM debe apoyar la modificación de documentos fáciles y eficientes.

        ⚫ JDOM debe ocultar las complejidades de XML siempre que sea posible, sin dejar de ser fiel a la especificación XML.

        ⚫ JDOM debe integrarse con DOM y SAX.

        ⚫ JDOM debe ser ligero y rápido.

        ⚫ JDOM debe resolver 80% (o más) problemas de Java / XML con 20% (o menos) del esfuerzo

 

¿Por qué se ha definido el API JDOM en loa términos de clases concretas en lugar de las interfaces?

Este tema ha sido discutido varias veces en la lista de correo JDOM, con varias personas de ambos lados. En general, muchas personas sienten que API basado en la clase es mejor cuando no se necesita las subclases, mientras que API basado en interfaz es mejor cuando se necesita subclases. Sin embargo, cualquiera de los sistemas puede ser utilizado en cualquiera de los casos.

Jason Hunter resume los argumentos en contra de una API basada en la interfaz para JDOM:

Con las interfaces todo se convierte en una fábrica, los elementos tienen que ser 'importados' en nuevos documentos en lugar de sólo ser añadidos, características como la serialización a largo plazo no puede ser garantizada, y la lista continúa.

Comenzamos con las interfaces de realidad. Durante nuestra revisión de pre-lanzamiento de algunos compañeros que recibimos las votaciones debemos probar las clases concretas. Lo hicimos, y el diseño era mucho mejor.

Piense en java.io.File como una analogía. Hay una razón por la que decimos:

File parent = new File (filepath);

File Child = new File (parent, "aaa.txt");

más bien que

FileSystem fs = FileSystem.getDefaultFileSystem ();

File Parent = fs.getFile (filepath);

File Child = fs.getFile (parent, "aaa.txt");

El primero es simplemente más fácil y más agradable de tratar.

Otro punto a tener en cuenta es que cualquier cosa que se pueda hacer con interfaces se pueden hacer con la subclasificación - la única pena es, posiblemente, las variables se utilizan en la clase base.

Como referencia, la última lista de correo de discusión sobre este tema comenzó el 30 de noviembre 2000 con "Interfaces", y continuó con "JDOM basado en interfaz" y "Anuncio: JDOMPlus". Sería de gran ayuda para revisar esta discusión antes de traer este tema en la lista de correo.

 

¿Cómo funciona JDOM con DOM y SAX?

Documentos JDOM se pueden construir a partir de archivos XML, árboles de DOM, eventos de SAX, o cualquier otra fuente. Documentos JDOM se pueden convertir en archivos XML, árboles DOM, eventos SAX, o cualquier otro destino. Esta capacidad resulta útil, por ejemplo, cuando se integra con un programa que espera eventos de SAX. JDOM puede analizar un archivo XML, dejar que el programador es fácil y manipulado de manera eficiente en el documento y, a continuación eventos SAX dejan de segundo programa directamente - sin conversión a un formato serializado que sea necesario.

 

¿Si JDOM está diseñado para los genéricos?

JDOM fue diseñado antes de los genéricos, pero JDOM 2.x ha tomado el diseño probado de JDOM 1.x y ampliado a utilizar medicamentos genéricos siempre que sea posible. En concreto, todas las operaciones basadas Colecciones requieren insumos debidamente mecanografiados y devuelven resultados debidamente mecanografiados. Además, JDOM 2.x se aprovecha de otros Java 5 características como varargs y tipos de retorno co-variantes.

Genéricos: Element.getAttributes () devuelve List<Atributo>, Element.getChildren () devuelve List<Element>, etc.

Tipos de Retorno Co-variant: Element.clone () devuelve Element, Text.detach () devuelve Text, etc.

Traté de usar JDOM y obtuve un error como este:

java.lang.NoSuchMethodError

 o

java.lang.NoClassDefFoundError: org / xml / sax / SAXNotRecognizedException

 

¿Qué está mal?

Usted necesita asegurarse de que el archivo xerces.jar está suministrado con la descarga JDOM y se encuentra en la ruta de clases antes de las otras clases XML, como los que vienen con JAXP o Crimson. Estas otras bibliotecas de XML, así como las versiones anteriores de Apache Xerces, apoyan DOM nivel 1 y SAX 1.0, no el requerido DOM Nivel 2 y SAX 2.0. El resultado es una excepción ser lanzado. Compruebe la ruta de clases, y vuelva a intentarlo. Si la ruta de clases se va bien, la problemática de JAR también podría estar escondida en el directorio de la extensión estándar del sistema (consulte la siguiente).

 

¿Qué quiere decir "el directorio de la extensión estándar"?

El directorio de la extensión estándar es un directorio que contiene los archivos JAR que se han buscado automáticamente por el tiempo de ejecución de Java y el compilador. Si ha instalado el JDK (no el sólo el JRE) que bien puede tener dos directorios ext separados, uno de los cuales se utilizan para la elaboración (por lo general en algún lugar como C: \ jdk1.3 \ jre \ lib \ ext) y el otro de los cuales se utiliza para la ejecución de código (por lo general en algún lugar como C: \ Archivos de programa \ JavaSoft \ jre \ 1.3 \ lib \ ext). El archivo JAR mal en cualquiera de directorio puede ponerse en su camino (aunque en diferentes momentos). Además, el archivo JAR correcto tiene que estar en ambos directorios.

 

¿Cómo puedo evitar el problema DOM Nivel 1 en Visual Age for Java?

Cuando se añade la característica WTE al área de trabajo, se añade el proyecto de IBM Analizador XML para Java 'también. Este proyecto contiene 'org.w3c. *' Vieja DOM Nivel 1 interfaces. JDOM se basa en DOM Nivel 2, y por lo tanto conficta con este proyecto. La solución es hacer lo siguiente:

1.     Cambiar workspace de administrador propietario

2.     Crear edición abierta del proyecto 'IBM Analizador XML para Java'

3.     Eliminar todos los paquetes que contienen org.w3c. * Interfaces

4.     Versa el proyecto.

5.     Crear un nuevo Proyecto de DOM Nivel 2 analizador como Xerces

6.     Importar todas las clases Xerces incluyendo org.w3c. * Interfaces (puedes utilizar un proyecto completamente diferente para las interfaces si desea trabajar con otros programas de análisis)

7.     Project versión los Xerces

8.     Crear un proyecto JDOM e importar las clases de JDOM. Versa el proyecto

(Contribución por Guy Nirpaz)

 

¿Cómo puedo evitar el problema DOM Nivel 1 en WebSphere?

WebSphere tiene el mismo problema con DOM nivel 1 interfaces como VAJ arriba. La solución es hacer uno de los siguientes:

Ponga el camino hacia xerces.jar (u otros DOM Nivel 2 interfaces) en el 'com.ibm.ejs.sm.adminserver.classpath' variable en el admin.config archivo. Este reside en $WAS_ROOT $ / bin antes de todas las otras variables.

o, si ejecuta WAS $WAS_ROOT/ bin / debug / adminserver. {bat | sh} debe añadir una línea 'set WAS_CP = xerces.jar' (u otro DOM Nivel 2 interfaces) antes de que otros comandos conjunto WAS_CP.

o, añadir JDOM a la CLASSPATH del servidor de aplicaciones, utilizando el archivo admin.cfg o la consola de administración.

(Contribución por Guy Nirpaz)

 

¿Qué versión JDOM trabaja con cúal JDK?

Versiones 1.x JDOM apoyan JDK 1.2 y versiones posteriores.

Versiones 2.x JDOM apoyan JDK 1.5 y versiones posteriores.

 

¿Existen cifras de rendimiento?

El proceso de desarrollo 2.x JDOM ha incluido puntos de referencia para el seguimiento de los cambios de rendimiento. Hay números de rendimiento que comparen diferentes versiones de JDOM 2.x, así como comparan el rendimiento de JDOM en diferentes versiones de JDK.

Dennis Sosnoski corrió pruebas de rendimiento en el pasado. En general, la mayoría de los modelos de objetos XML están en un barrio similar.

 

¿Cómo se integra JDOM con XSLT?

Hay muchas maneras de hacer XSL transforma con JDOM. La forma más sencilla es utilizar la interfaz de transformador JAXP estándar y las clases JDOMSource / JDOMResult que se encuentran en el paquete org.jdom2.transform. Mira a la muestra denominada XSLTransform como un ejemplo.

 

¿Hay apoyo XPath en JDOM?

¡Sí! Está totalmente integrado en org.jdom2.xpath partir de Beta 9, basado en Jaxen.

¿Qué características de XML que no son manejadas por JDOM?

Ninguna que sepamos.

 

¿Si JDOM es un programa seguro?

API de núcleo no está intencionalmente seguro. En otras palabras, no hay bloques sincronizados dentro org.jdom. Esta decisión tiene sentido porque esperamos que los casos primarios de uso JDOM sean:

Hilo individual lee un flujo XML en JDOM y lo mira de sóla parte de lectura

Hilo individual lee un flujo XML en JDOM y lo modifica

Hilo individual lee un flujo XML en JDOM y lo pone a disposición de un sistema de tiempo de ejecución para acceso de sóla la lectura

El caso de uso en un "hilo individual lee un flujo XML en JDOM y lo expone a múltiples hilos de modificar su contenido" es un fenómeno bastante raro. En ese caso, JDOM todavía puede ser hecha de hilo seguro, pero el programador simplemente tiene que realizar su propia sincronización, tal vez como la sincronización en la instancia de documento.

Por otro lado, hay ciertas funciones que requieren partes "operativas" de JDOM para estar seguro de rosca:

org.jdom2.Namespace.getNamespace () es seguro

Todas las clases de tipo de fábrica son seguros (XPathFactory, etc.)

 

¿Por qué equals () sólo hacen un cheque ==?

En JDOM dos objetos de contenido sólo son equals si tienen el mismo objeto. Esto permite que una llamada como list.remove (elem) quita sólo Element exacto aprobado en no cualquier elemento que es equivalente. Esta es una distinción muy importante. Hacer las iguales completas () sobre un elemento requeriría recursiva el árbol, y, en general, creemos que es poco probable que usted querrá saber si este elemento y todos sus hijos son equivalentes a otro. Si realmente quieres saber que usted puede escribir algo de código comparación a sí mismo que comprueba sólo lo que desea comprobar (sólo tal vez el nombre / espacios de nombres) en vez de hacer un recurse completa.

 

¿Por qué equals () se declaran ser finales?

Los métodos de equals () son los finales para JDOM clases de contenido para que una subclase no pueda romper el comportamiento == que se requiere para las llamadas como list.remove (elem) para trabajar como fue diseñado. Del mismo modo, los métodos hashCode () también son finales (para preservar la iguales / contrato hashCode).

 

¿Cómo construyo un documento a partir de String?

Utiliza las llamadas de la biblioteca estándar de Java IO. Envuelva String con un StringReader y pase al lector a SAXBuilder:

Document doc = builder.build (new StringReader (xml));

 

¿Cómo se quita Element u otro contenido?

Utilice los métodos en List devueltas por getChildren () o getContent (). JDOM no necesita tener los métodos especiales porque los métodos ya existen en List. Por ejemplo, para eliminar un elemento de List de los niños:

List Children = parent.getChildren ();

children.remove (element)// given child

children.remove (0); // first child

Otros métodos en List proporcionan opciones para eliminar todos los niños, añadir a un niño en un lugar determinado, y así sucesivamente.

Si usted tiene particular element u otro contenido que desea eliminar de parent, usted puede separar el contenido con el método Content.detach ().

 

¿Cómo puedo mover Element de un lugar a otro?

No hay necesidad de nodo "importador", como existe con DOM. Basta con retirar el elemento de su lugar actual, a continuación, agregar el elemento a su nuevo lugar. El contenido del elemento (incluyendo sus hijos elemento), naturalmente, "etiqueta" en el viaje. Tienes que eliminar el elemento antes de añadir a su nuevo lugar porque los elementos pueden tener sólo uno de los padres que devuelve getParent ().

newParent.addContent (elt.detach ());

 

¿Cómo puedo copiar Element de un lugar a otro?

No hay necesidad de nodo "importador", como existe con DOM. Sólo clonar el elemento que se está copiando y añada su clon en su nuevo lugar. Usted tiene que clonar el elemento antes de añadir a su nuevo lugar porque los elementos pueden tener sólo uno de los padres que devuelve getParent ().

newParent.addContent (elt.clone ());

 

¿Puede Element o nombre de atributo contener dos puntos?

La especificación XML 1.0 se reserva expresamente el carácter de colon para su uso con los espacios de nombres XML. Ningún otro uso es compatible con XML 1.0. Por lo tanto JDOM no permite crear nombres de elementos y atributos que contienen dos puntos, excepto cuando se utiliza espacios de nombres. Por otra parte, debido a la forma en espacios de nombres se implementan en JDOM, no se puede simplemente crear un elemento o atributo con un nombre totalmente calificado como svg: título. Es decir que no se puede hacer esto:

Element e = new Element ("svg: title");

En su lugar debe dividir las dos partes en Namespace y un nombre local. Esta es la forma JDOM adecuado para crear un elemento en namespace:

Element e =

 new element ("title", "svg", "http://www.w3.org/2000/svg");

El primer argumento es el nombre local. El segundo argumento es el prefijo. El tercer argumento es namespace URI.

Si usted está tratando de crear el xml: lang y xml: atributos espaciales use:

Element e =

  new element ("lang", Namespace.XML_NAMESPACE);

 

¿Por qué tengo que pasar en Namespace para GetChild (), cuando el elemento secundario que estoy buscando no tiene declaración de namespace?

Específicamente para este fragmento de XML debe usar:

<x>

  <xmlns y = "http://foo.com">

    <z />

  </ a>

</ x>

Es necesario utilizar tal código:

Namespace ns = Namespace.getNamespace ("http://foo.com");

Element y = x.getChild ("Y", ns);

Element z = y.getChild ("z", ns);

Si dejo namespace de la segunda llamada a GetChild (), me devuelve null. ¿Por qué lo pasa así?

JDOM trabaja en el árbol lógico en memoria de XML y no de la representación textual en un disco. Mientras que el elemento z no tiene declaración de namespace, tiene namespace que es uno heredado de su parent, que declara namespace por defecto (asociado a la URI http://foo.com).

De acuerdo con la especificación de espacios de nombres, el siguiente fragmento XML es idéntico en significado a la anterior:

<x>

  <xmlns y = "http://foo.com">

    <z xmlns = "http://foo.com" />

  </ a>

</ x>

La forma en que el API JDOM maneja namespaces significa que usted puede escribir código que funcione para ambos ejemplos. De lo contrario, tendría que tener el código que comprueba para cada caso por separado.

Del mismo modo, si estuviera construyendo (en lugar de la lectura) el XML en el primer ejemplo anterior, usted tendría que escribir código como este:

Namespace ns = Namespace.getNamespace ("http://foo.com");

Element y = new element ("Y", ns);

x.addContent (y);

Element z = new Element ("z", ns);

y.addContent (z);

Si usted dejó el namespace del constructor para el elemento z, usted tendría el siguiente árbol en memoria:

<x>

  <xmlns y = "http://foo.com">

    <z xmlns = "" />

  </ a>

</ z>

 

¿Por qué aparecen todas las nuevas líneas como \ n, incluso en Windows?

Según el artículo 2.11 de la Recomendación XML, segunda edición se trata de:

Para simplificar las tareas de las aplicaciones, un procesador de XML debe normalizar los saltos de línea en entidades analizadas a #xA ya sea mediante la traducción de la secuencia de dos caracteres #xD #xA y cualquier #xD que no vaya seguida de #xA a #xA de entrada antes de analizar , o mediante el uso de algún otro método de tal manera que los personajes pasen a la aplicación son los mismos que si lo hiciera esta traducción.

En otras palabras, esto es exactamente lo que se suponía que iba a suceder.

Algunas de entrada XML puede escapar de la \ r retorno de carro como & # xD; y el analizador XML se traducirá esto en un verdadero carácter \ r en su texto JDOM. Cuando este texto se emite de nuevo, se volverá a escapar como & # xD ;.

 

¿Por qué setText ("") no hace lo que quiero?

Cuando se pasa String en un método como setText () JDOM asume que es sólo eso String y no un fragmento de XML. Por ejemplo, cuando se llama:

element.setText ("")

JDOM asume que desea establecer el contenido de string que contiene los seis caracteres y # 1 6 0;. Es no analiza a tratar de entenderlo como XML. Por lo tanto, cuando la salida del texto usando XMLOutputter que escaparás, naturalmente, el carácter de signo especial y salida de & amp; # 160 ;. La solución es pasar personajes regulares Unicode al método setText () o, si tiene datos de texto que desea ser interpretado como XML y pasarlos a través de un analizador XML antes de entrar en JDOM. Esto es lo que hacen las clases SAXBuilder y DOMBuilder.

Cuando se utiliza un depurador IDE por qué se ve un ArrayIndexOutOfBoundsException extraño?

Algunos analizadores (inclusoXerces) utilizan esta excepción como parte de su procedimiento operativo estándar, lanzando internamente y agarrarando la excepción. Ningún código fuera de la biblioteca está destinado a verla. Sin embargo, los depuradores IDE suelen configurarse para reportar cualquier momento cuando esta excepción es lanzada, y por lo tanto, se exponen la excepción. Se puede omitir con seguridad.

 

¿Cómo puedo añadir un IP o comentario antes de root element?

Usted debe tener acceso al contenido del documento que se llama List. Trate de obtener la lista y añadir contenido a su cabeza, o establezca List de contenido de forma explícita.

doc.getContent () añadir (0, pi).;

o

doc.setContent (listOfContent);

 

¿Cómo puedo evitar contraer OutOfMemoryError?

La mayoría de las JVM tienen la opción de aumentar su tamaño máximo de almacenamiento dinámico, que es la cantidad máxima de memoria que la JVM puede utilizar para sus objetos. Puede configurar el tamaño inicial del almacenamiento dinámico de 32 megas y el tamaño máximo de almacenamiento dinámico de 64 megas con el siguiente comando:

java -Xms32m -Xmx64m SomeClass

Si usted no necesita todo el documento en la memoria, mire el paquete org.jdom.contrib.input.scanner del módulo jdom-contrib que le permite crear la parte de un documento a juego de una expresión XPath.

 

¿Por qué mi codificación del archivo de salida no coincide con la codificación de la entrada?

La codificación de caracteres predeterminado utilizado por XMLOutputter es UTF-8 es una codificación de longitud variable que puede representar todos los caracteres de Unicode. Esto se puede cambiar con una llamada a format.setEncoding () en el objeto Formato pasado a XMLOutputter. Sería bueno si XMLOutputter pueda no pagar a la codificación original de un archivo, pero desafortunadamente no indicar la codificación original. Tienes que configurarlo mediante el programa.

Este problema afecta con mayor frecuencia las personas con documentos en la ISO-8859-1 común (Latin-1) de codificación que utilizan caracteres como ñ, pero no están familiarizados con tener que pensar en las codificaciones. La punta de recordar es que con estos documentos debe establecer la codificación de salida a la norma ISO-8859-1 y de lo contrario caracteres en el rango de 128 a 255 se emitirá utilizando una codificación de doble byte en UTF-8 en lugar de la codificación normal de un solo byte de ISO-8859-1.

 

¿Por qué un documento no pasa a través de una toma que a veces cuelga el analizador?

El problema es que varios analizadores XML cerran el flujo de entrada cuando leen EOF (-1). Es el caso de Xerces, que es analizador por defecto de JDOM. También es cierto de Crimson. Por desgracia, el cierre de una SocketInputStream cierra la SocketImpl subyacente y establece el descriptor de archivo en null. Flujo de salida de la toma de corriente no sirve para nada después de esto, por lo que su aplicación no será capaz de enviar una respuesta. Para solucionar, proteja el flujo de entrada de su zócalo con una envoltura InputStream que no cierra la corriente subyacente (reemplazar el método close ()), o lea todo en un búfer antes de dar el relevo al constructor JDOM:

byte [] buf = new byte [longitud];

new DataInputStream (inputStream) .readFully (buf);

InputStream in = nueva ByteArrayInputStream (buf);

(Contribución de José Bowbeer)

¿Cómo puedo evitar el DTD de cargarlo? Incluso cuando apago la validación que el analizador intenta cargar el archivo DTD.

Incluso cuando la validación se apaga, un analizador XML por defecto carga el archivo DTD externa con el fin de analizar el DTD para declaraciones de entidades externas. Xerces tiene una función para desactivar este comportamiento llamado "http://apache.org/xml/features/nonvalidating/load-external-dtd" y si usted sabe que usted está usando Xerces, entonces puede configurar esta función en el constructor.

builder.setFeature (

  "http://apache.org/xml/features/nonvalidating/load-external-dtd", false);

Si está utilizando otro programa de análisis tal como Crimson, su mejor opción es establecer EntityResolver que resuelve el DTD sin llegar a leer el archivo separado.

import org.xml.sax. *;

import java.io. *;

public class NoOpEntityResolver implementa EntityResolver {

  public InputSource resolveEntity (String publicId, Cadena systemId) {

    volver nueva InputSource (nueva StringBufferInputStream (""));

  }

}

Luego llevélo en el constructor ...

builder.setEntityResolver (nueva NoOpEntityResolver ());

Hay una desventaja de este enfoque. Cualquier entidad en el documento se resolverá a String vacía, y desaparecerá con eficacia. Si el documento tiene entidades es necesario setExpandEntities tener código (falso) y garantizar la EntityResolver que sólo suprima el tipo de documento.

 

¿Cómo puedo validar con un esquema cuando se utiliza JDOM 2.x?

JDOM 2.x presenta un modelo simplificado para la validación de documentos. El org.jdom2.input.sax.XMLReaders Enum contiene miembros que establecen su validación para usted.

El código completo en JDOM 2.x tiene este aspecto:

SAXBuilder constructor =

  new SAXBuilder (XMLReaders.XSDVALIDATING);

Document doc = builder.build (xml);

 

¿Cómo puedo validar con un esquema cuando se utiliza JDOM 1.x?

JDOM 1.x no tiene su propio analizador, por eso utiliza analizadores estándares como Xerces para hacer el trabajo pesado. Si quieres validación del esquema asegúrese de elegir un programa de análisis que soporta esquemas. Xerces 2 es una buena opción (conseguirla de http://xml.apache.org). También es necesario utilizar código JDOM Beta 8 o posterior.

Para especificar el analizador utiliza JDOM, puede configurar JAXP adecuadamente (ya JDOM usa JAXP si está disponible, ver el final de esta entrada para más detalles) o puede pasar explícitamente el nombre del analizador al constructor SAXBuilder. Para Xerces 2 la clase analizador es org.apache.xerces.parsers.SAXParser. También debe habilitar la validación analizador pasando "true" al crear un SAXBuilder.

SAXBuilder constructor =

  new SAXBuilder ("org.apache.xerces.parsers.SAXParser", true);

A continuación, le dice al analizador (Xerces) que desea validar contra un esquema (o esquemas), y se pasa la información analizador de aquellos esquemas. Diferentes analizadores lo hacen de diferentes maneras. En Xerces se hace mediante el establecimiento de "características" especiales y "propiedades" del analizador. JDOM expone estos ajustes del analizador con el setFeature () y setProperty () los métodos de SAXBuilder. Se añadieron Estos métodos de paso a través después de Beta 7, por lo que usted necesita Beta 8 o superior.

Los esquemas se habilitan mediante el establecimiento de la función "http://apache.org/xml/features/validation/schema" true.

 

builder.setFeature (

  "http://apache.org/xml/features/validation/schema", true);

 

Ubicaciones de esquema se dan estableciendo la propiedad "http://apache.org/xml/properties/schema/external-schemaLocation" para List de espacios en blanco separados pares nombre-valor. El "nombre" es namespace del esquema que se asocia con el "valor" que es la ubicación del esquema para ese namespace. Por ejemplo:

builder.setProperty (

  "http://apache.org/xml/properties/schema/external-schemaLocation", "http://www.w3.org/2001/12/soap-envelope jabón envelope.xsd" + "" + "http : weblog.xsd //kevinj.develop.com/weblog/weblog.xsd ");

El ejemplo anterior muestra cómo podemos validar contra varios esquemas - en contra del esquema de SOAP 1.2, donde namespace es http://www.w3.org/2001/12/soap-envelope y de la y en contra de un esquema de namespace http: // kevinj.develop.com/weblog/weblog.xsd. Los archivos que describen estos esquemas están en jabón envelope.xsd y weblog.xsd respectivamente. Puede agregar tantos de estos pares de valores de nombre según sea necesario. Los valores propios son URLs. Los pares de valores de nombre siguen el significado dado en la recomendación de esquema (http://www.w3.org/TR/xmlschema-1/#schema-loc).

El código completo se puede ver así:

 

SAXBuilder constructor =

  new SAXBuilder ("org.apache.xerces.parsers.SAXParser", true);

builder.setFeature (

  "http://apache.org/xml/features/validation/schema", true);

builder.setProperty (

  "http://apache.org/xml/properties/schema/external-schemaLocation",

  "http://www.w3.org/2001/12/soap-envelope soap-envelope.xsd" + "" +

  "http://kevinj.develop.com/weblog/weblog.xsd weblog.xsd");

Document doc = builder.build (xml);

Si desea utilizar JAXP para seleccionar el analizador, puede omitir la especificación de una clase al constructor SAXBuilder y en lugar de establecer la propiedad del sistema "javax.xml.parsers.SAXParserFactory" al valor "org.apache.xerces.jaxp.SAXParserFactoryImpl" . Eso dice a JAXP que use fábrica Xerces 'para construir los analizadores. Si lo desea, puede especificar esta propiedad en la línea de comandos:

java -Djavax.xml.parsers.SAXParserFactory =

        ⚫    org.apache.xerces.jaxp.SAXParserFactoryImpl ...

(Contribución de Kevin Jones)

 

¿Cómo puedo realizar la validación en memoria contra un DTD o esquema?

Actualmente no se puede hacer esto, en JDOM o cualquier otro documento de Java modelo de objetos de la API. Sin embargo, esto es algo que nos gustaría JDOM para apoyar, y tenemos un voluntario que trabaja sobre eso.

 

JDOM siempre asegura que está bien formado el documento en la memoria. ¿Puede JDOM también asegurar el documento en la memoria que siempre sea válido?

No, es nuestra creencia actual de que es mejor para exponer una checkValid () tipo de llamada que intenta la comprobación de validación constante. Una de las razones es el rendimiento. La segunda razón es que usted tiene un problema de la gallina y el huevo donde por ejemplo un elemento exige exactamente dos elementos secundarios que sean válidas, pero después de añadir ya sea niño el documento estará en un estado temporal y no válido. Para solucionar esto requeriría algo así como modificaciones transaccionales, y eso es un montón de gastos de poca ganancia.

 

¿Por qué recibo un IndexOutOfBoundsException o ConcurrentModificationException en bucle?

Código como la siguiente lanzará una IndexOutOfBoundsException:

 List children = root.getChildren ("foo");

 int size = children.size ();

 for (int i = 0; i <tamaño; i ++) {

   Element child = (Element) children.get (i);

   child.detach ();

   otherRoot.addContent (child);

 }

La razón es que el tamaño de la lista es pre-calculado pero el tamaño se reduce en uno en cada detach () llamada, haciendo que el bucle para bajar el final de la lista. La forma correcta de bucle es utilizar un iterador. Con un iterador usted no tiene este problema, y ​​es más rápido también.

Sin embargo, incluso un iterador, el siguiente código lanza ConcurrentModificationException:

 List children = root.getChildren ("foo");

 Iterator ITR = children.iterator ();

 while (itr.hasNext ()) {

   Element child = (Element) itr.next ();

   child.detach ();

   otherRoot.addContent (child);

 }

La razón es que la llamada detach () modifica la lista de los niños, al mismo tiempo el iterador está atravesando la lista, y eso es una modificación concurrente. La solución es utilizar método remove () del iterador lugar de detach () en esta situación:

 

List children = root.getChildren ("foo");

 Iterator ITR = children.iterator ();

 while (itr.hasNext ()) {

   Element child = (Element) itr.next ();

   itr.remove ();

   otherRoot.addContent (child);

 }

 

¿Sí hay un archivo de las listas de correo JDOM?

Sí, todos los mensajes están disponibles para su lectura basada en la Web. A continuación se presentan la mancha investigable todo-en-uno de los archivos:

http://jdom.markmail.org

Hay archivos adicionales en las páginas web:

http://www.jdom.org/pipermail/jdom-interest/

http://www.jdom.org/pipermail/jdom-announce/

http://www.jdom.org/pipermail/jdom-commits/

 

¿Cómo me doy de baja de una lista de correo?

La URL para administrar su lista de miembros (incluyendo la suscripción) se adjunta en la parte inferior de cada mensaje de lista. Debe ser algo así como http://www.jdom.org/mailman/options/jdom-interest/ youraddr@yourhost.com. Asegúrese de reemplazar "youraddr" con su dirección y "yourhost" con su anfitrión. Para jdom-announce reemplace "interés" por "anunciar" en la URL.

¿Cómo puedo enviar a la lista de correo desde múltiples direcciones?

Para protección contra el spam, sólo los miembros de la lista de correo pueden publicar los postos. Para publicar de varias cuentas, suscríbase cada cuenta y configurar la función de "Disable mail delivery" en "On" para todas las cuentas adicionales. Puede configurar esta característica en la URL dada en la respuesta anterior.

 

¿Debo hacer preguntas generales XML a Jason, Brett, o Rolf?

No, son muy ocupados ya. Pero usted puede pedir el libro de Brett Java and XML o uno de los otros libros de introducción XML como XML Biblia escrito por Elliotte Rusty Harold (uno de nuestros prominentes miembros de la lista jdom-interest).

 

El libro Java and XML trata de JDOM 1.0; ¿por qué se confunde?

El libro tiene una beta temprana. Mucho ha cambiado (para mejor) desde la publicación del libro. Para los más precisos confianza API JDOM la Javadocs y no el libro. Brett era un poco optimista al escribir el libro. Su segunda edición pone las cosas en todo su orden.

 

Tengo una pregunta que no está respondida aquí. ¿Qué debo hacer?

En primer lugar, usted debe buscar en los archivos JDOM de lista de correo. Por ejemplo, si usted está usando un analizador de Oracle y ve un IllegalTargetException que huele a pescado, se puede buscar "IllegalTargetException oráculo" y encontrarás la discusión sobre el tema. Las búsquedas son de gran alcance y son rápidos!

Si no encuentra respuesta en los archivos, puede publicarla en jdom-interest. Si crees que has encontrado un error, asegúrese de seguir los siguientes consejos sobre los informes de errores!

¿Cómo envío un informe de error?

Si crees que has encontrado un error en JDOM, por favor, siga este procedimiento:

1.     Revise tanto las cuestiones abiertas y cerradas temas para ver si es un problema conocido.

2.     Compruebe si el problema se produce cuando se utiliza la última versión de desarrollo (.zip fuente) de JDOM.

3.     Busque en los listas de correo archivos de JDOM como se explicó anteriormente.

4.     Si usted no encuentra resolución con la última instantánea, o bien crear un tema en GitHub o enviados a la lista de correo de jdom-interest; asegúrese de que usted es un suscriptor de primera, ya que sólo los suscriptores pueden publicar.

5.     En el informe de error, dar tanta información como sea posible - el seguimiento de pila, un ejemplo de código reproducible y corto, el archivo XML causando problemas. Asegúrese de indicar la versión de JDOM utilizada (versión oficial o GitHub cometer).

6.     Si usted tiene un parche para corregir el error, por favor presente que, junto con el informe de problemas. Nos encanta parches.

7.      

¿Dónde puedo obtener más información?

Documentación de la API JDOM, se desliza desde el anuncio inicial JDOM, y otros recursos útiles todo se puede descargar aquí.