2010-11-23 15 views
7

J'ai un code HTML analysé à org.w3c.dom.Document. J'ai besoin de vérifier toutes les balises style attributs, les analyser, modifier certaines propriétés CSS et mettre la définition de style modifié à l'attribut.Parse HTML "style" attribut en utilisant Java

Existe-t-il des méthodes standard pour analyser l'attribut style? Comment puis-je utiliser les classes et les interfaces du package org.w3c.dom.css?

J'ai besoin d'une solution Java.

+2

+1 pour ne pas suggérer une regex. C'est ce que demande neuf aspirants sur dix, et comme nous le savons tous, cela ne peut pas être fait. –

Répondre

1

D'abord, je voudrais vérifier les classes dans les paquets javax.xml. Le package javax.xml.parsers contient des analyseurs pour deux styles d'analyse: SAXParser et DocumentBuilder. Il semble que vous vouliez que DocumentBuilder crée un DOM. Vous pouvez soit parcourir manuellement le DOM (lent et douloureux), soit utiliser le standard XPath pour rechercher des éléments dans le DOM. Le support Java pour cela est en javax.xml.xpath.

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

Il est de votre responsabilité de jeter les résultats au NodeList et itérer correctement, mais sa la manière la plus directe pour obtenir ce que vous voulez. Découvrez l'API DOM de Java pour plus d'informations sur la lecture et la modification des valeurs.

Je ne crois pas qu'il y ait un soutien pour un analyseur CSS construit en Java, mais vous pouvez regarder ces projets:

Cela peut vous aider avec vos objectifs. NOTE: l'analyseur Batik CSS est intégré dans le plus grand projet Apache Batik: http://xmlgraphics.apache.org/batik/index.html qui peut avoir plus que ce dont vous avez besoin, mais c'est une licence d'entreprise.

+0

HTML est déjà analysé, aussi je sais comment collecter des attributs de style. Maintenant, je dois analyser le contenu de ces attributs de style. C'est à dire.convertir une chaîne avec des définitions CSS en une collection de paires clé-valeur ou quelque chose de similaire. – Andrey

+0

Avez-vous regardé les projets d'analyseur CSS que je vous ai indiqués? Il n'y a pas de paquets javax. * Pour l'analyse CSS. L'approche du pauvre serait regex qui fonctionnera bien pour CSS - mais ce n'est pas ce que vous vouliez. –

+0

Merci pour les liens vers les bibliothèques. css.sac est destiné à analyser les feuilles de style CSS. cssparser n'a aucune documentation, même simple comment. Le batik semble être trop complexe pour ma tâche. – Andrey

0

Je suis sûr que je comprends pas complètement à vos besoins, mais au fond, vous aurez à:

  1. Lire la feuille de style (s) et extraire les règles CSS.
  2. Lisez la (les) page (s) HTML et trouvez les attributs.
  3. Substituez les nouvelles propriétés CSS aux anciennes propriétés CSS.
  4. Écrivez les pages HTML.

Il semble que vous utilisiez l'interface CSSStyleSheet pour extraire les règles CSS de la ou des feuilles de style.

+0

Non, j'ai une valeur d'attribut stye dans une chaîne et je dois l'analyser en paires clé-valeur selon les normes CSS. – Andrey

2

Si vous voulez un moyen de faire cela sans aucune dépendance, vous pouvez utiliser les classes de package javax.swing.text.html pour vous obtenir la plupart du chemin:

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" 

Ce retourne un StyleSheet.CssValue, qui est malheureusement pas public. Ainsi, le besoin de le convertir en une chaîne. En outre, il ne traitera pas em unités. C'est un peu intelligent sur les différents styles, cependant. Pas idéal, mais évite les dépendances.

+0

Merci pour la solution, mais j'aimerais voir quelque chose de plus général, quelque chose qui supporte les propriétés CSS non standard (par exemple moz_xxx). En d'autres termes, l'analyseur générique qui ne fait qu'analyser le style, ne l'implémente pas. – Andrey