org.xml.sax.SAXParseException:prolog中不允许引用

时间:2010-07-22 17:49:15

标签: java html dom xquery xml-parsing

我正在尝试转义字符串的html字符,并使用此字符串使用下面显示的parseXml方法构建DOM XML。接下来,我试图将此DOM文档插入数据库。但是,当我这样做时,我收到以下错误:

org.xml.sax.SAXParseException:prolog中不允许引用。

我有三个问题: 1)我不知道如何逃避双引号。我尝试了replaceAll(“\”“,”“”)并且不确定这是否正确。

2)假设我想要一个以双引号开头和结尾的字符串(例如:“sony”),我该如何编码?我试过像:

String sony =“\”sony \“”

这是对的吗?上面的字符串是否包含“sony”以及双引号,还是有其他方法可以做到?

3)我不确定在prolog中不允许使用“org.xml.sax.SAXParseException:Reference”。错误意味着有人可以帮我解决这个问题吗?

谢谢, 索尼

我的代码中的步骤:

  1. 的Utils。的java

    public static String escapeHtmlEntities(String s){         return s.replaceAll(“&”,“&”)。replaceAll(“<”,“<”)。replaceAll(“>”,“>”)。replaceAll(“\”“,” “”)。         replaceAll(“:”,“:”)。replaceAll(“/”,“/”);     }

        public static Document parseXml (String xml) throws Exception { 
    
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        factory.setNamespaceAware(true);
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document doc = builder.parse(new InputSource(new StringReader(xml)));
        doc.setXmlStandalone(false);
        return doc;
    }
    
  2. TreeController.java

    protected void notifyNewEntryCreated(String entryType)throws Exception {     for(Listener l:treeControlListeners)         l.newEntryCreated();

    final DomNodeTreeModel domModel = (DomNodeTreeModel) getModel();
    Element parent_item = getSelectedEntry();
    String xml = Utils.escapeHtmlEntities("<entry xmlns=" + "\"http://www.w3.org/2005/atom\"" + "xmlns:libx=" + 
            "\"http://libx.org/xml/libx2\">" + "<title>" + "New" + entryType + "</title>" +
            "<updated>2010-71-22T11:08:43z</updated>" + "<author> <name>LibX Team</name>" +
                "<uri>http://libx.org</uri>" + "<email>libx.org@gmail.com</email></author>" + 
                "<libx:" + entryType + "></libx:" + entryType + ">" + "</entry>");
    xmlModel.insertNewEntry(xml, getSelectedId());
    

    }

  3. XMLDataModel.java

  4. public void insertNewEntry(String xml,String parent_id)throws Exception {         insertNewEntry(Utils.parseXml(xml).getDocumentElement(),parent_id);     }

    public void insertNewEntry (Element elem, String parent_id) throws Exception {
    
        // inserting an entry with no libx: tag will create a storage leak
        if (elem.getElementsByTagName("libx:package").getLength() +
            elem.getElementsByTagName("libx:libapp").getLength() +
            elem.getElementsByTagName("libx:module").getLength() < 1) {
            // TODO: throw exception here instead of return
            return;
        }
    
        XQPreparedExpression xqp = Q.get("insert_new_entry.xq");
        xqp.bindNode(new QName("entry"), elem.getOwnerDocument(), null);
        xqp.bindString(new QName("parent_id"), parent_id, null);
        xqp.executeQuery();
        xqp.close();
    
        updateRoots();
    }
    
    1. insert_new_entry.xq
    2. 声明命名空间libx ='http://libx.org/xml/libx2'; declare namespace atom ='http://www.w3.org/2005/atom'; 将变量$ entry声明为xs:anyAtomicType external; 声明变量$ parent_id为xs:string external; 声明变量$ feed为xs:anyAtomicType:= doc('libx2_feed')/ atom:feed; 声明变量$ metadata为xs:anyAtomicType:= doc('libx2_meta')/ metadata; 让$ curid:= $ metadata / curid 返回节点$ curid的值替换数据($ curid)+ 1, 让$ newid:= data($ metadata / curid)+ 1 返回插入节点        {$ NEWID} {       $进入/的 / 的     }    进入$ feed, 让$ newid:= data($ metadata / curid)+ 1 返回if($ parent_id ='root')then() 其他   插入节点http://libx.org/xml/libx2'/&gt;成   $饲料/原子:条目[原子:ID = $ PARENT_ID] //(libx中:模块| libx中:libapp | libx中:封装)

2 个答案:

答案 0 :(得分:0)

要转义双引号,请使用以XML格式预定义的&quot;实体。

因此,您的示例字符串(例如属性值)将类似于

   <person name="&quot;sony&quot;"/>

撇号/单引号也有&apos;

我看到你有很多替换所有的电话,但替换看起来是一样的吗?还有一些其他字符无法按字面意思使用,但应该进行转义:

  &  --> &amp;
  >  --> &gt;
  <  --> &lt;
  "  --> &quot;
  '  --> &apos;

(编辑:好的,我看到这只是格式化 - 实体在被SO呈现时变成了实际值。)

SAX异常是解析器由于XML无效而抱怨。

除了转义文本外,您还需要确保它符合XML的well-formedness rules。要做到这一点还有很多,所以使用第三方库编写XML通常更简单。例如,dom4j中的XMLWriter。

答案 1 :(得分:0)

您可以查看Tidy规范。它是w3c发布的一个规范。几乎所有最近的语言都有自己的实现。

而不仅仅是替换或关心&lt; ,&gt;,&amp;只需配置JTidy(用于java)选项并解析。这抽象了Xml逃逸事物的所有复杂性。

我使用了基于python,java和marklogic的整洁实现。都解决了我的目的