2010-11-23 26 views
7

org.w3c.dom.Document'a ayrıştırılmış HTML kodum var. Tüm etiketi style özniteliklerine bakmalı, ayrıştırmalı, bazı CSS özelliklerini değiştirmeli ve değiştirilmiş stil tanımını tekrar özniteliğe koymam gerekiyor.Java kullanarak "stil" özniteliğini ayrıştırma

style özniteliğini ayrıştırmada standart yollar var mı? org.w3c.dom.css paketinden sınıfları ve arabirimleri nasıl kullanabilirim?

Bir Java çözümüne ihtiyacım var.

+2

+1. Bu, 10 yeni kitabın 9'unun ilkini soruyor ve hepimizin bildiği gibi, bu yapılamaz. –

cevap

1

İlk olarak, javax.xml paketlerindeki sınıfları denetlerim. javax.xml.parsers paketinde iki ayrıştırma stili için ayrıştırıcılar bulunur: SAXParser ve DocumentBuilder. DocumentBuilder'ın bir DOM oluşturmasını istediğiniz gibi görünüyor. DOM'ı manuel olarak (yavaş ve ağrılı) geçebilir veya DOM'daki öğeleri aramak için XPath standardını kullanabilirsiniz. Bunun için Java desteği javax.xml.xpath'dur.

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

O nodelist sonuçları döküm ve düzgün yineleme sizin sorumluluğunuz, ama istediğini almak için onun en doğrudan yolu. Değerleri okumak ve değiştirmek hakkında daha fazla bilgi için Java'nın DOM API'sine göz atın.

Java yerleşik bir CSS ayrıştırıcı için herhangi bir destek yoktur inanmıyorum, ama bu projeler bakabilirsiniz:

size yardımcı olabilecek That hedeflerinle. NOT: Batik CSS ayrıştırıcısı daha büyük Apache Batik projesine dahil edilmiştir: http://xmlgraphics.apache.org/batik/index.html, ihtiyacınız olandan daha fazlasına sahip olabilir, ancak şirket dostu bir lisanstır.

+0

HTML zaten ayrıştırıldı, ayrıca stil niteliklerini nasıl toplayacağımı biliyorum. Şimdi bu stil özelliklerinin içeriğini ayrıştırmak zorundayım. YaniCSS tanımlarıyla dizeyi anahtar/değer çiftleri veya benzer bir koleksiyona dönüştürün. – Andrey

+0

Sizi işaret ettiğim CSS çözümleyici projelerine baktınız mı? CSS'yi ayrıştırmak için javax. * Paketleri yoktur. Zavallı adamın yaklaşımı, CSS için iyi bir şekilde işe yarayacak olan regex olurdu - ama istediğin bu değildi. –

+0

Kütüphane bağlantıları için teşekkürler. css.sac, CSS stil sayfalarını ayrıştırmak için tasarlanmıştır. cssparser hiç bir dokümantasyona sahip değildir, hatta basit nasıl yapılır. batik benim görevim için çok karmaşık görünüyor. – Andrey

0

ben tamamen ihtiyaçlarınızı anlamak emin değilim, ama temelde, sen gerekecek:

  1. stil (ler) okuma ve CSS kurallarını ayıklamak.
  2. HTML sayfalarını okuyun ve öznitelikleri bulun.
  3. Eski CSS özelliklerinin yerine yeni CSS özelliklerini değiştirin.
  4. HTML sayfalarını yazın.

CSSStyleSheet arabirimini kullanarak, sytsheet (ler) inden CSS kurallarını ayıklamak için kullanabilirsiniz. Eğer bir yolu herhangi bir bağımlılık olmadan bunu yapmak istiyorsanız

+0

Hayır, bir dizede bir stye öznitelik değerine sahibim ve bunu CSS standartlarına göre anahtar/değer çiftlerine ayırmak zorundayım. – Andrey

2

size orada yol en iyi şekilde javax.swing.text.html paket sınıfları kullanabilirsiniz:

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" 

Bu maalesef kamu olmadığı, bir StyleSheet.CssValue döndürür. Böylece onu bir String'e dönüştürme ihtiyacı. Ayrıca, em birimleri işlemez. Gerçi, çeşitli stilleri hakkında akıllıca bir şey. İdeal değil, ama bağımlılıkları önler. Bir regex önermediği için

+0

Çözüm için teşekkürler, ancak standart olmayan CSS özelliklerini (ör. Moz_xxx) destekleyen bir şey daha genel görmek istiyorum. Başka bir deyişle, stili yalnızca ayrıştıran jenerik ayrıştırıcı, uygulamamaktadır. – Andrey

İlgili konular