gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 03:47:49 24 4
gpt4 key购买 nike

我正在尝试转义字符串的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com