Analizar archivo que contiene fragmentos XML en Java

Heredé un archivo de licencia "XML" que no contiene ningún elemento raíz, sino más bien dos fragmentos XML ( <XmlCreated>y <Product>) así que cuando trato de analizar el archivo, (con expectativa) recibo un error sobre un documento que no está bien formado.

Necesito obtener las etiquetas XmlCreatedy Product.

Archivo XML de muestra:

<?xml version="1.0"?>

<XmlCreated>May 11 2009</XmlCreated>

<!-- License Key file Attributes -->
<Product image ="LicenseKeyFile">

 <!-- MyCompany -->
 <Manufacturer ID="7f">
  <SerialNumber>21072832521007</SerialNumber>
  <ChassisId>72060034465DE1C3</ChassisId>
  <RtspMaxUsers>500</RtspMaxUsers>
  <MaxChannels>8</MaxChannels>
 </Manufacturer>

</Product>

Aquí está el código actual que uso para intentar cargar el XML. No funciona, pero lo he usado antes como punto de partida para XML bien formado.

public static void main(String[] args) {
    try {
        File file = new File("C:\\path\\LicenseFile.xml");
        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document doc = db.parse(file);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

En la db.parse(file)línea, obtengo la siguiente excepción:

[Fatal Error] LicenseFile.xml:6:2: The markup in the document following the root element must be well-formed.
org.xml.sax.SAXParseException: The markup in the document following the root element must be well-formed.
 at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
 at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
 at com.mycompany.licensesigning.LicenseSigner.main(LicenseSigner.java:20)

¿Cómo haría para analizar este archivo frustrante?

Respuesta 1

Si sabe que este documento siempre estará mal formado ... hágalo así. Agregue una nueva <root>etiqueta ficticia después del <?xml...>y </root>después del último de los datos.

Respuesta: 2

Tendrá que crear dos objetos de documento separados dividiendo el archivo en partes más pequeñas y analizando esas piezas individualmente (o alternativamente reconstruyéndolas en un documento más grande agregando una etiqueta que las encierre a ambas).

Si se puede confiar en la estructura del fichero, debe ser fácil de leer el archivo en una cadena y luego buscar subcadenas como <Producty </Product>y luego utilizar esos marcadores para crear una cadena que puede pasar en un constructor de documentos.

Respuesta: 3

¿Qué tal implementar un contenedor simple alrededor de InputStream que envuelve la entrada del archivo con una etiqueta de nivel raíz y usar eso como entrada para DocumentBuilder.parse()?

Si la entrada esperada es lo suficientemente pequeña como para cargarla en la memoria, leer en una cadena, envolverla con una etiqueta ficticia de inicio / finalización y luego usar:

DocumentBuilder.parse(new InputSource(new StringReader(string)))
Respuesta: 4

Probablemente crearía un SequenceInputStream donde emparedar la secuencia real con dos ByteArrayInputStreams que devuelven alguna etiqueta de inicio de raíz ficticia y una etiqueta final.

Luego, usaría el método de análisis que toma una secuencia en lugar de un nombre de archivo.

Respuesta: 5

Hay un jar que tiene 2 versiones en la versión 1, principalmente 2 clases Clase A Clase B La clase A tiene un constructor como A (X, B) en la versión 2, hay principalmente 2 clases y una interfaz Clase A ...

En primer lugar, soy nuevo en Java y Eclipse. En Visual Basic, agregaron una función que le permitía presionar el botón Ctrl para que el contenido de la ayuda sea transparente de forma temporal. Esto te permitió ...

Necesito analizar una expresión xpath para recuperar el nombre de nodo / atributo / predicado / etc. de la expresión para su posterior procesamiento. No me dirijo a un archivo xml específico. Para el xpath / root / nodeA [...

Estoy teniendo este extraño problema con Swing. Tengo un JPanel principal al que estoy agregando un JTabbedPane. Dentro de este JTabbedPane, estoy agregando otro panel: myTabbedPane.add (innerPanel, "Title", 0); ...