2010-11-23 113 views
7

我的HTML代碼解析爲org.w3c.dom.Document。我需要檢查所有標記style屬性,解析它們,更改一些CSS屬性並將修改後的樣式定義返回到屬性。使用Java解析HTML「樣式」屬性

是否有任何標準的方法來解析style屬性?我如何使用org.w3c.dom.css包中的類和接口?

我需要一個Java解決方案。

+2

+1不表示正則表達式。這就是10個新生物中有9個首先要求的,我們都知道,這是不能做到的。 – 2010-11-23 13:19:09

回答

1

首先,我會查看javax.xml包中的課程。 javax.xml.parsers包中包含兩種解析風格的解析器:SAXParser和DocumentBuilder。這聽起來像是你想讓DocumentBuilder創建一個DOM。您可以手動遍歷DOM(緩慢且痛苦),也可以使用XPath標準在DOM中查找元素。 Java的支持在javax.xml.xpath

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

這是你的責任將結果投到NodeList並正確迭代,但它的最直接的方式來得到你想要的。查看Java的DOM API以獲取更多關於讀取和更改值的信息。

我不相信這是對內置Java中的CSS解析器任何支持,但你可以看看這些項目:

,可以幫助您與你的目標。注意:Batik CSS解析器已被納入較大的Apache Batik項目中:http://xmlgraphics.apache.org/batik/index.html可能比您需要的要多,但這是一個企業友好的許可證。

+0

HTML已被解析,我也知道如何收集樣式屬性。現在我必須解析這些樣式屬性的內容。即將CSS定義的字符串轉換爲鍵值對或類似的集合。 – Andrey 2010-11-23 13:54:47

+0

你看過我指出的CSS解析器項目嗎?沒有用於解析CSS的javax。*包。這個可憐的人的方法是正則表達式,對於CSS來說工作正常 - 但這不是你想要的。 – 2010-11-23 14:31:11

+0

感謝您的圖書館鏈接。 css.sac打算解析CSS樣式表。 cssparser根本沒有文檔,甚至是簡單的操作方法。蠟染似乎對我的任務來說太複雜了。 – Andrey 2010-11-23 15:18:08

0

我不知道我完全理解你的要求,但基本上,你必須:

  1. 閱讀樣式表(S)和提取的CSS規則。
  2. 閱讀HTML頁面並找到屬性。
  3. 替換舊CSS屬性的新CSS屬性。
  4. 撰寫HTML頁面。

它看起來像你會使用CSSStyleSheet接口從sytlesheet(s)中提取CSS規則。

2

如果你想辦法做到這一點沒有任何依賴關係,你可以使用javax.swing.text.html包中的類,讓你最那裏的方式:

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" 

這會返回一個StyleSheet.CssValue,這是不幸的是沒有公開。因此需要將其轉換爲字符串。此外,它不會處理em單位。不過,這對於各種風格來說都很明智。不理想,但避免依賴。