2010-07-22 67 views
1

我試圖轉義字符串的html字符,並使用此字符串使用下面顯示的parseXml方法構建DOM XML。接下來,我試圖將這個DOM文檔插入到數據庫中。但是,當我這樣做時,我收到以下錯誤:org.xml.sax.SAXParseException:在序言中不允許引用

org.xml.sax.SAXParseException:在prolog中不允許使用引用。

我有三個問題: 1)我不知道如何逃避雙引號。我試過replaceAll(「\」「,」"「),我不確定這是否正確。

2)假設我想要一個以雙引號開頭和結尾的字符串(例如:」sony「),我如何?代碼它,我想是這樣:

字符串索尼=「\」 SONY \「」?

這是正確的將上面的字符串包含「SONY」與雙引號一起,還是有這樣做的另一種方式?

3)我不確定什麼「org.xml.sax.SAXParseException:引用在prolog中是不允許的」,錯誤的意思是,有人可以幫我解決這個問題嗎?

感謝, 索尼

步驟在我的代碼:

  1. utils的。的java

    公共靜態字符串escapeHtmlEntities(一個String){ 返回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)爲(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. XMLDataModel.java

公共無效insertNewEntry(XML字符串,字符串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'; declare namespace atom ='http://www.w3.org/2005/atom'; 將變量$條目聲明爲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)+ 1 返回插入節點 {$:= $元數據/ curid 返回數據($ curid)+ 1, 讓$ newid的替換節點$ curid的值NEWID} { $條目/ / } 到$飼料, 讓$ NEWID:=數據($元數據/ curid)+ 1 返回如果($ PARENT_ID = '根'),則() 別的 將節點http://libx.org/xml/libx2'/>插入到 $ feed/atom:entry [atom:id = $ parent_id] //(libx:module | libx:libapp | libx:package)

    +0

    嗨, 我知道錯誤:「org.xml.sax.SAXParseException:引用不允許在序言。」當被加載的XML沒有有效的XML時拋出。 因此,整個問題歸結爲將字符串轉換爲有效的xml。 所以我想整個問題歸結爲將上述示例中使用的字符串「xml」轉換爲有效的xml。 我猜測我的轉義和使用html雙引號字符的方式是錯誤的。我仍然對上述帖子中的問題1和2感到困惑。 感謝您的幫助。 -Sony – sony 2010-07-22 18:45:04

    回答

    0

    要轉義雙引號,請使用以XML格式預定義的&quot;實體。

    所以,你的榜樣串,說的屬性值,會像

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

    還有&apos;的撇號/單引號。

    我看到你有很多replaceAll調用,但替換似乎是相同的?有跡象表明,不能從字面上使用一些其他的字符,但應該進行轉義:

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

    (編輯:好吧,我看這只是格式化 - 實體正在變成他們實際值將被提出時, SO)

    SAX異常是解析器因爲無效的XML而抱怨。

    除了轉義文本外,還需要確保它符合XML的well-formedness rules。有很多事情要做,所以使用第三方庫來寫出XML通常更簡單。例如,dom4j中的XMLWriter。

    0

    您可以查看Tidy規格。它由w3c發佈的一個規範。幾乎所有最近的語言都有自己的實現。

    而不僅僅是替換或只關心<,>,&只是配置JTidy(用於java)的選項和解析。這抽象了Xml轉義事物的所有複雜性。

    我已經使用了python,java和基於marklogic的整潔實現。所有解決我的目的

    相關問題