我正在尝试转义字符串的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”。错误意味着有人可以帮我解决这个问题吗?
谢谢, 索尼
我的代码中的步骤:
的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;
}
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());
}
XMLDataModel.java
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();
}
声明命名空间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中:封装)
答案 0 :(得分:0)
要转义双引号,请使用以XML格式预定义的"
实体。
因此,您的示例字符串(例如属性值)将类似于
<person name=""sony""/>
撇号/单引号也有'
。
我看到你有很多替换所有的电话,但替换看起来是一样的吗?还有一些其他字符无法按字面意思使用,但应该进行转义:
& --> &
> --> >
< --> <
" --> "
' --> '
(编辑:好的,我看到这只是格式化 - 实体在被SO呈现时变成了实际值。)
SAX异常是解析器由于XML无效而抱怨。
除了转义文本外,您还需要确保它符合XML的well-formedness rules。要做到这一点还有很多,所以使用第三方库编写XML通常更简单。例如,dom4j中的XMLWriter。
答案 1 :(得分:0)
您可以查看Tidy规范。它是w3c发布的一个规范。几乎所有最近的语言都有自己的实现。
而不仅仅是替换或关心&lt; ,&gt;,&amp;只需配置JTidy(用于java)选项并解析。这抽象了Xml逃逸事物的所有复杂性。
我使用了基于python,java和marklogic的整洁实现。都解决了我的目的