使用SAX和W3C Java库的XML/HTML生成器类可以';不能处理HTML输入

使用SAX和W3C Java库的XML/HTML生成器类可以';不能处理HTML输入,java,html,xml,saxparser,Java,Html,Xml,Saxparser,全部, 我正在开发一个JavaWeb服务,它从外部数据库获取归档数据 要求是,除了以XML消息的形式返回结果外,客户机还可以请求将结果显示在HTML页面上 此图描述了高级设计: 但我在实施时意识到,XML和HTML并不完全相同,例如: HTML解析可以允许不关闭特定元素 这导致我当前的类实现抛出这些错误(由HTML输入引起) 错误消息 [03/Mar/2014:09:12:05] warning (19052): CORE3283: stderr: [Fatal Error] we

全部,

我正在开发一个JavaWeb服务,它从外部数据库获取归档数据

要求是,除了以XML消息的形式返回结果外,客户机还可以请求将结果显示在HTML页面上

此图描述了高级设计:

但我在实施时意识到,XML和HTML并不完全相同,例如:

  • HTML解析可以允许不关闭特定元素
这导致我当前的类实现抛出这些错误(由HTML输入引起)

错误消息

[03/Mar/2014:09:12:05] warning (19052):     CORE3283: stderr: [Fatal Error] web.html:1:3: The markup in the document preceding the root element must be well-formed.
[03/Mar/2014:09:12:05] warning (19052):     CORE3283: stderr: org.xml.sax.SAXParseException: The markup in the document preceding the root element must be well-formed. 
我的代码

    import org.w3c.dom.*;
import javax.xml.parsers.*;
import org.w3c.dom.Element;
import org.xml.sax.SAXException;


public class OutputBuilder
{
    private DocumentBuilderFactory docBF;
    private DocumentBuilder docBuilder;
    private Document doc;
    private static float UUID;
    private String docType;

    public OutputBuilder(String template, String output) throws ParserConfigurationException, SAXException, IOException
    {
        docBF = DocumentBuilderFactory.newInstance();
        docBuilder = docBF.newDocumentBuilder();

        //set the base document to the specified template file
        doc = docBuilder.parse(new File(template));
        //
        docType = output;
    }

    /*
     * Build the final document by adding values passed in from query results
     */
    public void fillTemplate(ResultSet qR) throws SQLException
    {
        if(docType.equals("html"))
        {
            //find the designated point of data insertion to the html document
            Element appendPoint = doc.getElementById("archive_table");

            //get meta data column names for table header row
            ResultSetMetaData rsmd = qR.getMetaData();

            //generate this first row which is the header
            Element headerRow = doc.createElement("tr");

            //create a column in the table header for each column in the query results
            for (int i = 0; i < rsmd.getColumnCount(); i++)
            {
                Element tableH = doc.createElement("th");
                tableH.setNodeValue(rsmd.getColumnName(i));
                headerRow.appendChild(tableH);              
            }

            //append header row to table
            appendPoint.appendChild(headerRow);

            //fill table body rows with query results

            while(qR.next())
            {
                //create a table row for each row in query results
                Element bodyRow = doc.createElement("tr"); 


                //fill that row with all column values in query results
                for(int i = 0; i < rsmd.getColumnCount(); i++)
                {
                    Element tableB = doc.createElement("td");
                    tableB.setNodeValue(qR.getString(i));
                    bodyRow.appendChild(tableB);
                }
                //add each constructed row to the table
                appendPoint.appendChild(bodyRow);
            }

        }
        else
        {
            //do XML construction
        }

    }

}
导入org.w3c.dom.*; 导入javax.xml.parsers.*; 导入org.w3c.dom.Element; 导入org.xml.sax.SAXException; 公共类输出生成器 { 私人文档生成器工厂docBF; 私人文档生成器文档生成器; 私人文件文件; 私有静态浮点UUID; 私有字符串docType; 公共OutputBuilder(字符串模板、字符串输出)抛出ParserConfiguration异常、SAXException、IOException { docBF=DocumentBuilderFactory.newInstance(); docBuilder=docBF.newDocumentBuilder(); //将基础文档设置为指定的模板文件 doc=docBuilder.parse(新文件(模板)); // docType=输出; } /* *通过添加从查询结果传入的值来构建最终文档 */ 公共void fillTemplate(ResultSet qR)引发SQLException { if(docType.equals(“html”)) { //找到html文档的指定数据插入点 元素appendPoint=doc.getElementById(“归档表”); //获取表标题行的元数据列名 ResultSetMetaData rsmd=qR.getMetaData(); //生成作为标题的第一行 元素headerRow=doc.createElement(“tr”); //在表标题中为查询结果中的每一列创建一列 对于(int i=0;i 为了让我的类同时处理XML和HTML构造,我必须执行哪些特定的库或新的逻辑

欢迎任何其他建议


请投票选出一个问题的好例子

我建议您开始使用专用的html解析器进行此类操作。我个人使用Jsoup 您也可以使用它构建自己的HTML结构