Pregunta

He, algunos bien formado miles de documentos SGML, algunos no tan bien formado

. Necesito llegar a ciertos elementos en los documentos, pero cada vez que voy a la carga y tratar de leerlas en un XDocument, XMLDocument, o incluso sólo un StreamReader, consigo diferentes XmlException varios errores.

Las cosas como " '[' es un símbolo inesperado.". ¿Por qué? Porque tengo un documento con DOCTYPE como

<!DOCTYPE RChapter PUBLIC "-//LSC//DTD R Chapter for Authoring//EN" [] >

y he aprendido que los "[]" tiene que tener algo dentro válida. Una vez más, no controlo la creación de los documentos, pero tengo a "crack" ellos y obtener los datos que quiero. Otro ejemplo está teniendo un "unclosed" ELEMENT, por ejemplo:

<Caption>Plants, and facilities<hardhyphen><hyphen>Inspection.</Caption>

Este es XMLException "La 'guión' etiqueta de inicio en la línea 27 no coincide con la etiqueta final del 'Leyenda'. La línea 27, la posición 58." Obvio, ¿verdad?

Pero entonces la pregunta es ¿cómo se puede conseguir realmente en ciertos elementos en estos documentos, sin encontrar XMLExceptions. Es un analizador SAX de la manera correcta? Básicamente quiero abrir el documento, ir a la derecha al elemento que quiero (sin preocuparse de lo que podría o no podría ser bien formado cercano), extraer los datos, y seguir adelante. Debería olvidar el análisis con XMLDocument, XDocument, y sólo hacer reemplazos de cadenas simples como

str.Replace("<hardhypen><hyphen>", "-")

y luego tratar de cargarlo en uno de los analizadores XML. ¿Algún consejo sobre las estrategias?

¿Fue útil?

Solución

El problema es que usted está tratando de analizar SGML con una herramienta XML. No son lo mismo. Si desea utilizar una herramienta / lenguaje XML para acceder a los datos, es probable que necesite para convertir el SGML a XML antes de tratar de analizarlo.

Lo ideal sería utilizar un lenguaje / herramienta que apoya el SGML (como OmniMark) o algo que se puede manejar "XML como" datos (como nokogiri desde la primera respuesta?).

Esto puede ser bastante simple, pero puede ser complicado en algunos puntos. Especialmente si usted está hablando de múltiples doctypes (DTD). (También, no hay tal cosa como SGML "bien formada". Sí, los elementos / etc. Que pueden anidar correctamente, pero SGML tiene para tener una DTD.)

Aquí hay algunas diferencias entre SGML y XML que se necesitaría para manejar. (Es posible que no desea seguir este camino, pero puede ser útil para fines informativos de todos modos.):

  1. declaración DOCTYPE

    La declaración DOCTYPE en su ejemplo es un tipo de documento SGML perfectamente válido. El [] (subconjunto interno) no tiene que tener nada en ella. Si usted tiene declaraciones en el subconjunto interno (por lo general las declaraciones de entidades), es más que probable que va a tener que seguir una declaración DOCTYPE en el XML.

    El tema del analizador XML está teniendo es que usted no tiene un identificador de sistema en la declaración. En una declaración DOCTYPE XML, se requiere el identificador del sistema si hay un identificador público. En una declaración SGML tipo de documento, no se requiere.

    El fondo : A menos que necesite el XML para analizar a un DTD / esquema o tiene declaraciones en el subconjunto interno, despojar a la declaración DOCTYPE. Si el XML tiene que ser válida, usted por lo menos necesidad de añadir un identificador de sistema. No se olvide de agregar la instrucción de procesamiento <?xml ...?>.

  2. Elementos sin fin etiquetas

    elementos

    El <hardhyphen> y <hyphen> son SGML válida. SGML DTD permiten especificar la minimización de la etiqueta. Lo que esto significa es que se puede especificar si se requiere o no una etiqueta final. (También se puede hacer la etiqueta de inicio opcional, pero eso es una locura.) En XML hay que cerrar estos elementos (como <hardhyphen/> o <hardhyphen></hardhyphen>)

    Lo mejor que puede hacer es mirar su SGML DTD y ver qué elementos tienen etiquetas finales opcionales. La minimización de la etiqueta se especifica después del nombre del elemento de la declaración de elemento. Un '-' significa que se requiere la etiqueta. Una 'o' significa que la etiqueta es opcional (letra 'oh'). Por ejemplo si usted ve <!ELEMENT hyphen - o (#PCDATA)>, esto significa que se requiere la etiqueta de inicio (-) y la etiqueta de cierre es opcional (o). Si ve <!ELEMENT hyphen - - (#PCDATA)>, se requiere que tanto el inicio como las etiquetas finales.

    El fondo : cerrar correctamente todos los elementos que no tienen fines etiquetas

  3. instrucciones de procesamiento

    Las instrucciones de procesamiento (PI) en SGML no tienen la segunda ? cuando están cerrados, como XML hace. Usted tendrá que añadir el segundo ?.

    Ejemplo SGML PI: <?asdf jkl>

    Ejemplo XML PI: <?asdf jkl?>

  4. Inclusiones / Exclusiones

    Probablemente no tendrá que preocuparse por esto, pero en una DTD SGML se puede especificar en una declaración de elemento que otro elemento está permitido en cualquier lugar dentro de ese elemento (o no permitido). Esto puede ser un problema si el código XML de destino debe analizar a un DTD; de XML DTD no permiten inclusiones / exclusiones.

    Esto es lo que una inclusión podría ser:

    <!ELEMENT chapter - - (section)+ +(revst|revend)>

    Esto es decir que revst o revend se permiten en cualquier lugar dentro de chapter. Si la declaración de elemento tenía -(revst|revend), esto significaría que revst o revend es no permitidos en cualquier lugar dentro de chapter.

Espero que esto ayude.

Otros consejos

Sí, usar Nokogiri .

desplazarse un poco en esa página y copiar el código en "Sinopsis" en un archivo, por ejemplo xml-parser.rb. Entonces, si estás en un Mac (Rubí ya viene instalado en los Macs.), De la Terminal, gem install nokogiri correr, y luego ejecutar el archivo con:. ruby xml-parser.rb

También puede a continuación, escriba irb derecha de la terminal y luego require 'nokogiri' y empezar a jugar un poco con el API nokogiri en tiempo real. Gotta love Rubí interactiva. :)

Si estás en Windows, intente esto Rubí instalador para Windows .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top