org.xml.sax.SAXParseException:prolog中不允许引用

问题描述 投票:2回答:2

我试图逃避字符串的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”。错误意味着有人可以帮我解决这个问题吗?

谢谢,索尼

我的代码中的步骤:

  1. 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; }
  2. 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>[email protected]</email></author>" + "<libx:" + entryType + "></libx:" + entryType + ">" + "</entry>"); xmlModel.insertNewEntry(xml, getSelectedId()); }
  3. XML data model.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();
}
  1. insert_new_entry.xq

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)

java html dom xquery xml-parsing
2个回答
0
投票

你可以查看Tidy规范。它是w3c发布的一个规范。几乎所有最近的语言都有自己的实现。

而不仅仅是替换或关心<,>,只需配置JTidy(用于java)选项和解析。这抽象了Xml逃逸事物的所有复杂性。

我已经使用了基于python,java和marklogic的整洁实现。都解决了我的目的


0
投票

要转义双引号,请使用以XML格式预定义的&quot;实体。

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

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

撇号/单引号也有&apos;

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

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

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

由于XML无效,SAX异常是解析器抱怨。

除了转义文本外,您还需要确保它符合XML的well-formedness rules。要做到这一点还有很多,所以使用第三方库编写XML通常更简单。例如,dom4j中的XMLWriter。

© www.soinside.com 2019 - 2024. All rights reserved.