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

Java org.xml.sax.SAXParseException:prolog中不允许引用,java,html,dom,xquery,xml-parsing,Java,Html,Dom,Xquery,Xml Parsing,我试图转义字符串的html字符,并使用此字符串使用如下所示的parseXml方法构建DOM XML。接下来,我尝试将这个DOM文档插入数据库。但是,当我这样做时,我会得到以下错误: org.xml.sax.SAXParseException:prolog中不允许引用 我有三个问题: 1) 我不知道如何避开双引号。我尝试了replaceAll(“\”,“”),但不确定这是否正确 2) 假设我想要一个以双引号开头和结尾的字符串(例如:“sony”),我该如何编码它?我试过这样的方法: 字符串sony

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

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

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

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

字符串sony=“\”sony“”

是这样吗?上面的字符串将包含“sony”和双引号,还是有其他方法

3) 我不确定“org.xml.sax.SAXParseException:prolog中不允许引用”的意思。有人能帮我修一下吗

谢谢, 索尼

我的代码中的步骤:

  • 乌提尔斯。爪哇

    公共静态字符串escapeHtmlEntities(字符串s){ 返回s.replaceAll(“”,“&”).replaceAll(“”)。replaceAll(“”,“”)。 replaceAll(“:”,“:”)。replaceAll(“/”,“/”); }

  • TreeController.java

    受保护的void notifyNewEntryCreated(String entryType)引发异常{ for(侦听器l:treeControlListeners) l、 newEntryCreated()

    final DomNodeTreeModel domModel=(DomNodeTreeModel)getModel();
    元素父项\项=getSelectedEntry();
    String xml=Utils.escapeHtmlEntities(“+”+“New”+entryType+”)+
    “2010-71-22T11:08:43z”+”;
    声明名称空间原子=“”;
    将变量$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)+1替换节点$curid的值,
    设$newid:=data($metadata/curid)+1
    返回插入节点
    {$newid}{
    $entry//
    }
    变成$feed,
    设$newid:=data($metadata/curid)+1
    如果($parent_id='root'),则返回()
    其他的
    插入节点http://libx.org/xml/libx2“/>进入
    
    $feed/atom:entry[atom:id=$parent_id]/(libx:module | libx:libapp | libx:package)

    要转义双引号,请使用XML中预定义的
    实体

    因此,您的示例字符串(比如属性值)如下所示

       <person name="&quot;sony&quot;"/>
    
    (编辑:好的,我看到这只是格式化-当SO显示实体时,它们被转换为实际值。)

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


    除了转义文本外,您还需要确保它符合XML的标准。有很多地方需要正确处理,因此使用第三方库来编写XML通常更简单。例如,中的XMLWriter。您可以查看Tidy规范。这是w3c发布的规范。几乎所有最近的语言都有自己的实现n

    而不仅仅是替换或只关心<,>,&只需配置JTidy(用于java)选项和解析


    我使用了python、java和基于marklogic的tidy实现。所有这些都解决了我的问题

    Hi,我了解到错误:“org.xml.sax.SAXParseException:prolog中不允许引用。”当加载的XML没有有效的XML时抛出。因此,整个问题归结为将字符串转换为有效的XML。因此,我认为整个问题归结为转换字符串“XML”在上面的例子中使用了有效的xml。我猜我转义和使用html双引号字符的方式有问题。我仍然对上面文章中的问题1和2感到困惑。谢谢你的帮助。-索尼
    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());
    
    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();
    }
    
       <person name="&quot;sony&quot;"/>
    
      &  --> &amp;
      >  --> &gt;
      <  --> &lt;
      "  --> &quot;
      '  --> &apos;