www w3org specification official java sgml

java - w3org - html5 official website



SGML parser en Java? (6)

Aunque es un post muy antiguo, no estoy afirmando que la respuesta que ofrezco sea perfecta, pero cumplió mi propósito. Por lo tanto, estoy guardando este código que escribí usando pila para obtener los datos de una manera que se requería en mi caso. Espero que pueda ser de ayuda para otros.

try (BufferedReader br = new BufferedReader(new FileReader(new File( fileName)))) { while ((line = br.readLine()) != null) { line = line.trim(); int startOfTag = line.indexOf("<"); int endOfTag = line.indexOf(">"); String currentTag = ""; if (startOfTag > -1 && endOfTag > -1) { if (countStart) headerTagsCounter++; currentTag = line.substring(startOfTag + 1, endOfTag); String currentData = line.substring(endOfTag + 1, line.length()); if (i == 1) { tagStack.push(currentTag); i++; } if (currentData.isEmpty() || currentData == "") {//If there is no data, its a parent tag... if (!currentTag.contains("/")) {// if its an opening tag... switch (currentTag) {// these tags are useless in my case, so just skipping these tags. case "CORRECTION": case "PAPER": case "PRIVATE-TO-PUBLIC": case "DELETION": case "CONFIRMING-COPY": case "CAPTION": case "STUB": case "COLUMN": case "TABLE-FOOTNOTES-SECTION": case "FOOTNOTES": case "PAGE": break; default: { countStart = false; int tagCounterNumber = 0; String historyTagToRemove = ""; for (String historyTag : historyStack) { String tagCounter = ""; if (historyTag.contains(currentTag)) {//if it''s a repeating tag..Append the counter and update the same in history tag.. historyTagToRemove = historyTag; if (historyTag .equalsIgnoreCase(currentTag)) { tagCounterNumber = 1; } else if (historyTag.length() > currentTag .length()) { tagCounter = historyTag .substring(currentTag .length()); if (tagCounter != null && !tagCounter.isEmpty()) { tagCounterNumber = Integer .parseInt(tagCounter) + 1; } } } } if (tagCounterNumber > 0) currentTag += tagCounterNumber; if (historyTagToRemove != null && !historyTagToRemove.isEmpty()) { historyStack.remove(historyTagToRemove); historyStack.push(currentTag); } tagStack.push(currentTag); break; } } } else// if its end of a tag... Match the current tag with top of stack and if its a match, pop it out { currentTag = currentTag.substring(1); String tagRemoved = ""; String topStackTag = tagStack.lastElement(); if (topStackTag.contains(currentTag)) { tagRemoved = tagStack.pop(); historyStack.push(tagRemoved); } if (tagStack.size() < 2) cik = ""; if (tagStack.size() == 2 && cik != null && !cik.isEmpty()) for (int j = headerTagsCounter - 1; j < tagList.size(); j++) { String item = tagList.get(j); if (!item.contains("@@")) { item += "@@" + cik; tagList.remove(j); tagList.add(j, item); } } } } else {// if current tag has some data... currentData = currentData.trim(); String stackValue = ""; for (String tag : tagStack) { if (stackValue != null && !stackValue.isEmpty() && stackValue != "") stackValue = stackValue + "||" + tag; else stackValue = tag; } switch (currentTag) { case "ACCESSION-NUMBER": accessionNumber = currentData; break; case "FILING-DATE": dateFiled = currentData; break; case "TYPE": formType = currentData; break; case "CIK": cik = currentData; break; } tagList.add(stackValue + "$$" + currentTag + "::"+ currentData); } } } // Now all your data is available with in tagList, stack is separated by ||, key is separated by $$ and value is separated by :: } } catch (Exception e) { // TODO Auto-generated catch block } }

Salida:

Fuente del archivo: http://10k-staging.s3.amazonaws.com/edgar0105/2016/12/20/935015/000119312516799070/0001193125-16-799070.hdr.sgml

Salida de código:

SEC-HEADER$$SEC-HEADER::0001193125-16-799070.hdr.sgml : 20161220 SEC-HEADER$$ACCEPTANCE-DATETIME::20161220172458 SEC-HEADER$$ACCESSION-NUMBER::0001193125-16-799070 SEC-HEADER$$TYPE::485APOS SEC-HEADER$$PUBLIC-DOCUMENT-COUNT::9 SEC-HEADER$$FILING-DATE::20161220 SEC-HEADER$$DATE-OF-FILING-DATE-CHANGE::20161220 SEC-HEADER||FILER||COMPANY-DATA$$CONFORMED-NAME::ARTISAN PARTNERS FUNDS INC@@0000935015 SEC-HEADER||FILER||COMPANY-DATA$$CIK::0000935015@@0000935015 SEC-HEADER||FILER||COMPANY-DATA$$IRS-NUMBER::391811840@@0000935015 SEC-HEADER||FILER||COMPANY-DATA$$STATE-OF-INCORPORATION::WI@@0000935015 SEC-HEADER||FILER||COMPANY-DATA$$FISCAL-YEAR-END::0930@@0000935015 SEC-HEADER||FILER||FILING-VALUES$$FORM-TYPE::485APOS@@0000935015 SEC-HEADER||FILER||FILING-VALUES$$ACT::33@@0000935015 SEC-HEADER||FILER||FILING-VALUES$$FILE-NUMBER::033-88316@@0000935015 SEC-HEADER||FILER||FILING-VALUES$$FILM-NUMBER::162062197@@0000935015 SEC-HEADER||FILER||BUSINESS-ADDRESS$$STREET1::875 EAST WISCONSIN AVE STE 800@@0000935015 SEC-HEADER||FILER||BUSINESS-ADDRESS$$CITY::MILWAUKEE@@0000935015 SEC-HEADER||FILER||BUSINESS-ADDRESS$$STATE::WI@@0000935015 SEC-HEADER||FILER||BUSINESS-ADDRESS$$ZIP::53202@@0000935015 SEC-HEADER||FILER||BUSINESS-ADDRESS$$PHONE::414-390-6100@@0000935015 SEC-HEADER||FILER||MAIL-ADDRESS$$STREET1::875 EAST WISCONSIN AVE STE 800@@0000935015 SEC-HEADER||FILER||MAIL-ADDRESS$$CITY::MILWAUKEE@@0000935015 SEC-HEADER||FILER||MAIL-ADDRESS$$STATE::WI@@0000935015 SEC-HEADER||FILER||MAIL-ADDRESS$$ZIP::53202@@0000935015 SEC-HEADER||FILER||FORMER-COMPANY$$FORMER-CONFORMED-NAME::ARTISAN FUNDS INC@@0000935015 SEC-HEADER||FILER||FORMER-COMPANY$$DATE-CHANGED::19950310@@0000935015 SEC-HEADER||FILER||FORMER-COMPANY1$$FORMER-CONFORMED-NAME::ZIEGLER FUNDS INC@@0000935015 SEC-HEADER||FILER||FORMER-COMPANY1$$DATE-CHANGED::19950109@@0000935015 SEC-HEADER||FILER1||COMPANY-DATA1$$CONFORMED-NAME::ARTISAN PARTNERS FUNDS INC@@0000935015 SEC-HEADER||FILER1||COMPANY-DATA1$$CIK::0000935015@@0000935015 SEC-HEADER||FILER1||COMPANY-DATA1$$IRS-NUMBER::391811840@@0000935015 SEC-HEADER||FILER1||COMPANY-DATA1$$STATE-OF-INCORPORATION::WI@@0000935015 SEC-HEADER||FILER1||COMPANY-DATA1$$FISCAL-YEAR-END::0930@@0000935015 SEC-HEADER||FILER1||FILING-VALUES1$$FORM-TYPE::485APOS@@0000935015 SEC-HEADER||FILER1||FILING-VALUES1$$ACT::40@@0000935015 SEC-HEADER||FILER1||FILING-VALUES1$$FILE-NUMBER::811-08932@@0000935015 SEC-HEADER||FILER1||FILING-VALUES1$$FILM-NUMBER::162062198@@0000935015 SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$STREET1::875 EAST WISCONSIN AVE STE 800@@0000935015 SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$CITY::MILWAUKEE@@0000935015 SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$STATE::WI@@0000935015 SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$ZIP::53202@@0000935015 SEC-HEADER||FILER1||BUSINESS-ADDRESS1$$PHONE::414-390-6100@@0000935015 SEC-HEADER||FILER1||MAIL-ADDRESS1$$STREET1::875 EAST WISCONSIN AVE STE 800@@0000935015 SEC-HEADER||FILER1||MAIL-ADDRESS1$$CITY::MILWAUKEE@@0000935015 SEC-HEADER||FILER1||MAIL-ADDRESS1$$STATE::WI@@0000935015 SEC-HEADER||FILER1||MAIL-ADDRESS1$$ZIP::53202@@0000935015 SEC-HEADER||FILER1||FORMER-COMPANY2$$FORMER-CONFORMED-NAME::ARTISAN FUNDS INC@@0000935015 SEC-HEADER||FILER1||FORMER-COMPANY2$$DATE-CHANGED::19950310@@0000935015 SEC-HEADER||FILER1||FORMER-COMPANY3$$FORMER-CONFORMED-NAME::ZIEGLER FUNDS INC@@0000935015 SEC-HEADER||FILER1||FORMER-COMPANY3$$DATE-CHANGED::19950109@@0000935015 SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS$$OWNER-CIK::0000935015 SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES$$SERIES-ID::S000056665 SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES$$SERIES-NAME::Artisan Thematic Fund SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES||CLASS-CONTRACT$$CLASS-CONTRACT-ID::C000179292 SEC-HEADER||SERIES-AND-CLASSES-CONTRACTS-DATA||NEW-SERIES-AND-CLASSES-CONTRACTS||NEW-SERIES||CLASS-CONTRACT$$CLASS-CONTRACT-NAME::Investor Shares

Estoy buscando un analizador en Java que pueda analizar un documento formateado en SGML.

Para monitores duplicados: soy consciente de los otros dos subprocesos que tratan este tema: ¿Cómo analizar la cadena Java con SGML ¿La conversión de SGML a XML de Java? Pero tampoco tiene una resolución, de ahí el nuevo tema.

Para las personas que confunden XML con SGML: Lea esto: http://www.w3.org/TR/NOTE-sgml-xml-971215#null (en resumen, hay suficientes diferencias sutiles para al menos hacerlo inutilizable en su forma de vainilla

Para las personas que les gusta pedir carteles a Google: ya lo hice y lo más cerca que pude encontrar fue el popular SAXParser: http://download.oracle.com/javase/1.4.2/docs/api/javax/xml/parsers/SAXParser.html Pero eso, por supuesto, es un analizador XML. Estoy mirando alrededor para ver si alguien ha implementado una modificación del SAX Parser para acomodar SGML.

Por último, no puedo usar SX porque estoy buscando una solución Java.

¡Gracias! :)


No hay una API para analizar SGML utilizando Java en este momento. Tampoco hay ninguna API o biblioteca para convertir SGML a XML y luego analizarlo utilizando Java. Dado que el estado de SGML ha sido suplantado por XML para todos los proyectos en los que he trabajado hasta ahora, no creo que se realice ningún trabajo en esta área, pero eso es solo una suposición.

Here hay un código de código fuente abierto de una universidad que lo hace, sin embargo, no lo he probado y tendrías que buscar para encontrar las otras clases dependientes. Creo que la única solución viable en Java requeriría expresiones regulares.

Además, aquí hay un link para el software público SGML / XML.



Tengo algunos enfoques para este problema

Lo primero es lo que hizo: verifique si el documento de sgml está lo suficientemente cerca de XML para que el analizador de SAX estándar funcione.

El segundo es hacer lo mismo con los analizadores HTML. El truco aquí es encontrar uno que no ignore los elementos que no son HTML.

Encontré algunos analizadores Java SGML, más en acedemia, cuando buscaba "sgml parser Java". No sé qué tan bien funcionan.

El último paso es tomar un analizador SGML estándar (no Java) y transformar los documentos en algo que pueda leer en Java.

Parece que pudiste trabajar con el primer paso.


Utilizo OpenSP a través de JNI, ya que parece que no hay un analizador SGML de Java puro. He escrito un contenedor experimental tipo SAX que está disponible en http://sourceforge.net/projects/sasgml (por supuesto, tiene todos los inconvenientes de JNI ... pero fue suficiente para mis requisitos).

Otro enfoque es convertir el documento a XML usando sx de Open SP y luego ejecutar un analizador tradicional SAX.


Java SE incluye un analizador HTML en el paquete javax.swing.text.html.parser . Afirma en su documentación que es un analizador SGML general, pero luego contradice en la documentación que solo debe usarlo con la clase DTD HTML proporcionada.

Si lo pone en modo indulgente y sus documentos SGML no tienen muchas etiquetas finales implícitas, puede obtener resultados razonables.

Lea sobre el analizador en su JavaDoc, aquí: http://docs.oracle.com/javase/6/docs/api/javax/swing/text/html/parser/DocumentParser.html

Crea una instancia como esta:

new DocumentParser(DTD.getDTD("html32"))

O puede ignorar las advertencias contra el uso de un DTD personalizado con DocumentParser y crear una subclase de DTD que coincida con las reglas de su propio formato SGML.

Esto claramente no es un analizador SGML de potencia industrial, pero debería ser un buen punto de partida para un esfuerzo de migración de datos de una sola vez. Lo he encontrado útil en proyectos anteriores para analizar HTML.