我正在尝试转义字符串的 html 字符,并使用该字符串使用如下所示的 parseXml 方法构建 DOM XML。接下来,我尝试将此 DOM 文档插入数据库。但是,当我这样做时,出现以下错误:
org.xml.sax.SAXParseException:序言中不允许引用。
我有三个问题: 1)我不确定如何转义双引号。我试过 replaceAll("\"", """) 但不确定这是否正确。
2) 假设我想要一个以双引号开头和结尾的字符串(例如:“sony”),我该如何编码?我试过类似的东西:
字符串索尼 = "\"索尼\""
这样对吗?上面的字符串是否包含“sony”和双引号,或者是否有其他方法?
3) 我不确定“org.xml.sax.SAXParseException:序言中不允许引用”是什么。错误的意思。有人可以帮我解决这个问题吗?
谢谢, 索尼
我的代码中的步骤:
实用程序。 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; }
树 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());
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();
}
- 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=""sony""/>
还有用于撇号/单引号的 '
。
我看到你有很多 replaceAll 调用,但替换似乎是一样的?还有一些字符不能按字面意思使用,但应该转义:
& --> &
> --> >
< --> <
" --> "
' --> '
(编辑:好的,我看到这只是格式化 - 实体在 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/