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:
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í.