2010-11-23 13 views
7

Tengo un código HTML analizado en org.w3c.dom.Document. Necesito comprobar todos los atributos de etiqueta style, analizarlos, cambiar algunas propiedades de CSS y volver a poner la definición de estilo modificada en el atributo.Parse HTML "estilo" atributo usando Java

¿Hay alguna manera estándar de analizar el atributo style? ¿Cómo puedo usar clases e interfaces del paquete org.w3c.dom.css?

Necesito una solución de Java.

+2

+1 por no sugerir un regex. Eso es lo que 9 de cada 10 newbs pide primero, y como todos sabemos, eso no se puede hacer. –

Respuesta

1

Primero, verificaría las clases en los paquetes javax.xml. El paquete javax.xml.parsers contiene analizadores para dos estilos de análisis: SAXParser y DocumentBuilder. Parece que desea que DocumentBuilder cree un DOM. Puede recorrer el DOM manualmente (lento y doloroso), o puede usar el estándar XPath para buscar elementos en el DOM. El soporte de Java para eso está en javax.xml.xpath.

XPathExpression xpath = XPath.compile("//@style"); 
Object results = xpath.evaluate(dom, XPathConstants.NODESET); 

es su responsabilidad para emitir los resultados de la NodeList y repetir correctamente, pero es la forma más directa de llegar a lo que desea. Consulte la API DOM de Java para obtener más información sobre cómo leer y cambiar valores.

no creo que hay ningún apoyo para un analizador CSS incorporado en Java, pero se puede ver en estos proyectos:

que pueden ayudarle con tus metas NOTA: el analizador de Batik CSS está incorporado en el proyecto más grande de Apache Batik: http://xmlgraphics.apache.org/batik/index.html, que puede tener más de lo que necesita, pero es una licencia amigable para las empresas.

+0

HTML ya está analizado, también sé cómo recopilar atributos de estilo. Ahora tengo que analizar el contenido de estos atributos de estilo. Es decir.convertir cadena con definiciones de CSS a una colección de pares clave-valor o algo similar. – Andrey

+0

¿Has mirado los proyectos del analizador de CSS que te indiqué? No hay paquetes javax. * Para analizar CSS. El enfoque del pobre sería regex, que funcionará bien para CSS, pero eso no es lo que querías. –

+0

Gracias por los enlaces de la biblioteca. css.sac está destinado a analizar hojas de estilo CSS. cssparser no tiene documentación, incluso simples instrucciones. batik parece ser demasiado complejo para mi tarea. – Andrey

0

no estoy seguro de entender completamente sus necesidades, pero en el fondo, usted tendrá que:

  1. Leer la hoja de estilo (s) y extracto de las reglas CSS.
  2. Lea la (s) página (s) HTML y encuentre los atributos.
  3. Sustituya las nuevas propiedades CSS por las antiguas propiedades CSS.
  4. Escriba la página HTML (s).

Parece que usaría la interfaz CSSStyleSheet para extraer las reglas de CSS de la (s) hoja (s) de diálogo.

+0

No, tengo un valor de atributo stye en una cadena y tengo que analizarlo con pares clave-valor según los estándares CSS. – Andrey

2

Si quieres una manera de hacer esto sin ningún tipo de dependencias puede utilizar las clases del paquete javax.swing.text.html para conseguir que la mayor parte del camino:

import javax.swing.text.html.*; 

StyleSheet styleSheet = new StyleSheet() 
AttributeSet dec = ss.getDeclaration("margin:2px;padding:3px"); 
Object marginLeft = dec.getAttribute(CSS.Attribute.MARGIN_LEFT); 
String marginLeftString = marginLeft.toString(); // "2px" 

Esto devuelve un StyleSheet.CssValue, que por desgracia no es pública. Por lo tanto, la necesidad de convertirlo en una cadena. Además, no manejará em unidades. Sin embargo, es un poco inteligente sobre varios estilos. No es ideal, pero evita las dependencias.

+0

Gracias por la solución, pero me gustaría ver algo más general, algo que admita propiedades de CSS no estándar (por ejemplo, moz_xxx). En otras palabras, un analizador genérico que solo analiza el estilo, no lo implementa. – Andrey

Cuestiones relacionadas