java - org.xml.sax.SAXParseException : Reference is not allowed in prolog

标签 java html dom xquery xml-parsing

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

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

我有三个问题: 1)我不确定如何转义双引号。我试过 replaceAll("\"", """) 但不确定这是否正确。

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

字符串索尼 = "\"索尼\""

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

3) 我不确定“org.xml.sax.SAXParseException:序言中不允许引用”是什么。错误的意思。有人可以帮我解决这个问题吗?

谢谢, 索尼

我的代码中的步骤:

  1. 实用程序。 Java

    public static String escapeHtmlEntities(String s) { 返回 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. 树 Controller .java

    protected void notifyNewEntryCreated(String entryType) 抛出异常{ 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

public void insertNewEntry(String xml,String parent_id)抛出异常{ 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

声明命名空间 libx=' http://libx.org/xml/libx2 '; 声明命名空间 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 := $元数据/curid 返回用 data($curid) + 1 替换节点 $curid 的值, 让 $newid := data($metadata/curid) + 1 返回插入节点 {$newid} { $条目// } 进入 $feed, 让 $newid := data($metadata/curid) + 1 返回 if ($parent_id = 'root') then () 别的 将节点 http://libx.org/xml/libx2'/> 插入 $feed/atom:entry[atom:id=$parent_id]//(libx:module|libx:libapp|libx:package)

最佳答案

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

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

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

还有用于撇号/单引号的 '

我看到你有很多 replaceAll 调用,但替换似乎是一样的?还有一些字符不能按字面意思使用,但应该转义:

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

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

SAX 异常是解析器因无效的 XML 而提示。

除了转义文本,您还需要确保它符合 well-formedness rules的XML。有很多事情要做,所以使用第 3 方库来写出 XML 通常更简单。例如 dom4j 中的 XMLWriter .

关于java - org.xml.sax.SAXParseException : Reference is not allowed in prolog,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3311781/

相关文章:

java - 我们可以将 JTable 的单元格作为 JComponent 检索吗?

java - System.exit(0) 作为最后一条语句有什么不同吗?

javascript - 引入 d3.js 的麻烦

php - 如何扩展 PHP DOMElement?

javascript - 如何让这个div滑过半个屏幕?

java - spring boot 2 中的语言环境

Java错误: java.net.BindException:地址已在使用中:JVM_Bindin服务器运行类

javascript - 如何使用 html class 或 ids 在任何地方显示内容

javascript - 单击按钮时更改 div 的内容

php - 使用 DOMXpath::query 获取 id 旁边的第一张图片