cyberneko html设置忽略未编码的大于和小于符号

时间:2011-03-29 09:56:05

标签: java cyberneko

我的htmlcontent包含大于和小于符号。但这些符号并未编码为& lt;和& gt;。为了平衡内容中的标签,我通过cyberneko html解析器传递内容。在解析大于和小于符号之间的内容之后,将丢弃。要解决这个问题,我必须在cyberneko html解析器中设置什么设置?

示例内容:

  

< div>平均响应时间   服务器很重要,因为它的价值   282> 0毫秒&LT峰; br> [阈值   详细信息:如果值为关键> 0,   如果value = 0则警告,如果值<清除   0]< / DIV>

解析nekohtml后

  

< DIV>&LT峰; br> 0]< / DIV>

请帮忙。提前致谢

1 个答案:

答案 0 :(得分:0)

以下程序将输出

< div>平均响应时间服务器至关重要,因为它的值为282& gt; 0毫秒< br /> [阈值详细信息:如果值& gt;则为关键; 0,如果值= 0则警告,如果值& lt则清除; 0]< / DIV>

package test;

import java.io.StringReader;

import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.apache.xerces.dom.DocumentImpl;
import org.cyberneko.html.parsers.DOMFragmentParser;
import org.w3c.dom.Document;
import org.w3c.dom.DocumentFragment;
import org.xml.sax.InputSource;

public class TestHTMLDOMFragment {
    private static final String PARSE_TEXT = "<div>Average Response Time server is critical because its value 282 > 0 ms. <br>[Threshold Details : Critical if value > 0, Warning if value = 0, Clear if value < 0]</div>";

    public static void main(String[] argv) throws Exception {
        DOMFragmentParser parser = new DOMFragmentParser();

        // output the elements in lowercase, nekohtml doesn't do this by default
        parser.setProperty("http://cyberneko.org/html/properties/names/elems","lower");

        // if this is set to true (the default, you dont need to specifiy this)
        // then neko html wont and an html,head and body tags to the response.
        parser.setFeature("http://cyberneko.org/html/features/document-fragment",true);

        Document document = new DocumentImpl();
        DocumentFragment fragment = document.createDocumentFragment();

        // parse the document into a fragment
        parser.parse(new InputSource(new StringReader(PARSE_TEXT)), fragment);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        // don't display the namespace declaration
        transformer.setOutputProperty("omit-xml-declaration", "yes");
        DOMSource source = new DOMSource(fragment);
        StreamResult result = new StreamResult(System.out);
        transformer.transform(source, result);

    }
}

上面代码中的注释显示了我使用过的解析器设置。

我还使用了org.cyberneko.html.parsers.DOMFragmentParser,因为可能也在解析只是html片段的文本

我正在使用nekohtml 1.9.14

如果你使用maven,这里是pom.xml依赖项部分......

<dependencies>
    <dependency>
        <groupId>net.sourceforge.nekohtml</groupId>
        <artifactId>nekohtml</artifactId>
        <version>1.9.14</version>
        <type>jar</type>
    </dependency>
</dependencies>