我试图逃避字符串的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”。错误意味着有人可以帮我解决这个问题吗?
谢谢,索尼
我的代码中的步骤:
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;
}
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>[email protected]</email></author>" +
"<libx:" + entryType + "></libx:" + entryType + ">" + "</entry>");
xmlModel.insertNewEntry(xml, getSelectedId());
}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();
}
declare namespace 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; let $ curid:= $ metadata / curid返回节点$ curid的值替换数据($ curid)+ 1,让$ newid:= data($ metadata / curid)+ 1 return insert node {$ newid} {$ entry / /}进入$ feed,让$ newid:= data($ metadata / curid)+ 1返回if($ parent_id ='root')then()else insert node http://libx.org/xml/libx2'/>进入$ feed / atom:entry [atom:id = $ parent_id] //(libx:module | libx:libapp | libx:package)
你可以查看Tidy规范。它是w3c发布的一个规范。几乎所有最近的语言都有自己的实现。
而不仅仅是替换或关心<,>,只需配置JTidy(用于java)选项和解析。这抽象了Xml逃逸事物的所有复杂性。
我已经使用了基于python,java和marklogic的整洁实现。都解决了我的目的
要转义双引号,请使用以XML格式预定义的"
实体。
因此,您的示例字符串(例如属性值)将如下所示
<person name=""sony""/>
撇号/单引号也有'
。
我看到你有很多replaceAll调用,但替换似乎是相同的?还有一些其他字符不能按字面意思使用,但应该进行转义:
& --> &
> --> >
< --> <
" --> "
' --> '
(编辑:好的,我看到这只是格式化 - 实体在被SO呈现时变成了实际值。)
由于XML无效,SAX异常是解析器抱怨。
除了转义文本外,您还需要确保它符合XML的well-formedness rules。要做到这一点还有很多,所以使用第三方库编写XML通常更简单。例如,dom4j中的XMLWriter。