Java: lea XML y deje todas las entidades en paz

Quiero leer archivos XHTML usando SAX o StAX, lo que funcione mejor. Pero no quiero que las entidades se resuelvan, reemplacen ni nada de eso. Idealmente, deberían permanecer como están. No quiero usar DTD.

Aquí hay un ejemplo (ejecutable, usando Scala 2.8.x):

import javax.xml.stream._
import javax.xml.stream.events._
import java.io._

println("StAX Test - "+args(0)+"\n")
val factory = XMLInputFactory.newInstance
factory.setProperty(XMLInputFactory.SUPPORT_DTD, false)
factory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, false)

println("------")
val xer = factory.createXMLEventReader(new FileReader(args(0)))
val entities = new collection.mutable.ArrayBuffer[String]
while (xer.hasNext) {
    val event = xer.nextEvent
    if (event.isCharacters) {
        print(event.asCharacters.getData)
    } else if (event.getEventType == XMLStreamConstants.ENTITY_REFERENCE) {
        entities += event.asInstanceOf[EntityReference].getName
    }
}
println("------")
println("Entities: " + entities.mkString(", "))

Dado el siguiente archivo xhtml ...

<html>
    <head>
        <title>StAX Test</title>
    </head>
    <body>
        <h1>Hallo StAX</h1>
        <p id="html">
            &lt;div class=&quot;header&quot;&gt;
        </p>
        <p id="stuff">
            &Uuml;berdies sollte das hier auch als Copyright sichtbar sein: &#169;
        </p>
        Das war's!
    </body>
</html>

... correr scala stax-test.scala stax-test.xhtmlresultará en:

StAX Test - stax-test.xhtml

------


    StAX Test


    Hallo StAX

      <div class="header">


      berdies sollte das hier auch als Copyright sichtbar sein: ?

    Das war's!

------
Entities: Uuml

Por lo tanto, todas las entidades han sido reemplazadas más o menos exitosamente. Sin embargo, lo que hubiera esperado y lo que quiero es esto:

StAX Test - stax-test.xhtml

------


    StAX Test


    Hallo StAX

      &lt;div class=&quot;header&quot;&gt;


      &Uuml;berdies sollte das hier auch als Copyright sichtbar sein: &#169;

    Das war's!

------
Entities: // well, or no entities above and instead:
// Entities: lt, quot, quot, gt, Uuml, #169

¿Es esto posible? Quiero analizar XHTML, hacer algunas modificaciones y luego mostrarlo como XHTML nuevamente. Así que realmente quiero que las entidades permanezcan en el resultado.

Además, no entiendo por qué Uuml se informa como un evento EntityReference, mientras que el resto no.

Respuesta 1

Un poco de terminología: &#x169;es una referencia de caracteres numéricos (no una entidad), y &#auml;es una referencia de entidad (no una entidad).

No creo que ningún analizador XML informe referencias de caracteres numéricos a la aplicación, siempre se expandirán. Realmente, su aplicación no debería preocuparse por esto más de lo que le importa cuánto espacio en blanco hay entre los atributos.

En cuanto a las referencias de entidad, las interfaces de análisis de bajo nivel como SAX informarán la existencia de la referencia de entidad; en cualquier caso, las informa cuando ocurren en el contenido del elemento, pero no en el contenido del atributo. Hay eventos especiales notificados solo a LexicalHandler en lugar de ContentHandler.

Respuesta: 2

La respuesta a "por qué Uuml se informa como un evento EntityReference mientras que el resto no lo es" es que el resto está definido por la especificación XML, mientras que &Uuml;es específico de HTML 4.0 .

Dado que su objetivo es escribir XHTML modificado, puede ser posible forzar al serializador a emitir referencias de entidad numéricas estableciendo la "codificación" en "US-ASCII" y / o el "método" en "html". La especificación XSLT (que subyace a los serializadores XML de Java) dice que el serializador "puede generar un carácter utilizando una referencia de entidad de caracteres" cuando el método es html. Establecer la codificación en ASCII puede obligarlo a usar entidades numéricas si no se admiten entidades con nombre.

Respuesta: 3

El código se proporciona a continuación ......... lista privada <EmployeeAllRec> listg; Lista privada <Lista de empleados>; Lista privada <Empleado> gridModel; Mapa privado <String, String> json; público ...

Quiero poder enviar una transmisión de video desde mi aplicación a un servidor de medios wowza. ¿Es posible y qué protocolos necesito admitir (estoy trabajando en una plataforma basada en J2ME)? Cualquier enlace será ...

Me gustaría saber si es posible leer de alguna manera los datos de un archivo de texto y usarlo para decirle a Java qué bibliotecas importar. No creo que sea posible en Java, pero ¿qué pasa con Groovy?

Quiero hacer algo así: public void myFun (String tIps []) {Socket s = new Socket (); s.connect (nueva InetSocketAddress (serverIp, 80), 1000); para (int i = 0; i <tIps ....