关于java:带HTML的内联外部CSS

Inline external CSS with HTML

我正在寻找一个Java库,它可以基于它的ID /类属性,使用一个EDCOX1×1文档来内嵌一个外部EDCOX1×0文件。

我找到了JStyleParser,但我不确定这是否是适合我的库。我似乎不明白它是否能在HTML的元素上嵌入CSS。文档和示例不是我所期望的。

有没有人能回答这个问题,或者有没有其他的图书馆?

谢谢


你可以试试cssbox。只需查看包中包含的Computestyles演示(有关运行演示的信息,请参阅分发包中的doc/examples/readme文件)。它计算所有样式并创建一个新的HTML文档(由DOM表示),其中包含相应的内联样式定义。

源代码在src/org/fit/cssbox/demo/computestyles.java中,非常短。实际上,它使用JStyleParser来完成主要的工作,CSSBox只是为此提供了一个更好的接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
        //Open the network connection
        DocumentSource docSource = new DefaultDocumentSource(args[0]);

        //Parse the input document
        DOMSource parser = new DefaultDOMSource(docSource);
        Document doc = parser.parse();

        //Create the CSS analyzer
        DOMAnalyzer da = new DOMAnalyzer(doc, docSource.getURL());
        da.attributesToStyles(); //convert the HTML presentation attributes to inline styles
        da.addStyleSheet(null, CSSNorm.stdStyleSheet(), DOMAnalyzer.Origin.AGENT); //use the standard style sheet
        da.addStyleSheet(null, CSSNorm.userStyleSheet(), DOMAnalyzer.Origin.AGENT); //use the additional style sheet
        da.getStyleSheets(); //load the author style sheets

        //Compute the styles
        System.err.println("Computing style...");
        da.stylesToDomInherited();

        //Save the output
        PrintStream os = new PrintStream(new FileOutputStream(args[1]));
        Output out = new NormalOutput(doc);
        out.dumpTo(os);
        os.close();

        docSource.close();


我对jsoup(v1.5.2)非常满意。我有这样的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
 public static String inlineCss(String html) {
    final String style ="style";
    Document doc = Jsoup.parse(html);
    Elements els = doc.select(style);// to get all the style elements
    for (Element e : els) {
      String styleRules = e.getAllElements().get(0).data().replaceAll("
"
,"").trim();
      String delims ="{}";
      StringTokenizer st = new StringTokenizer(styleRules, delims);
      while (st.countTokens() > 1) {
        String selector = st.nextToken(), properties = st.nextToken();
        if (!selector.contains(":")) { // skip a:hover rules, etc.
          Elements selectedElements = doc.select(selector);
          for (Element selElem : selectedElements) {
            String oldProperties = selElem.attr(style);
            selElem.attr(style,
                oldProperties.length() > 0 ? concatenateProperties(
                    oldProperties, properties) : properties);
          }
        }
      }
      e.remove();
    }
    return doc.toString();
  }

  private static String concatenateProperties(String oldProp, @NotNull String newProp) {
    oldProp = oldProp.trim();
    if (!oldProp.endsWith(";"))
      oldProp +=";";
    return oldProp + newProp.replaceAll("\\s{2,}","");
  }