2014-02-13 74 views
1

我從匯合使用REST API如何將Confluence存儲格式xml轉換爲HTML?

https://docs.atlassian.com/atlassian-confluence/REST/3.2/

的API返回與內容屬性融合的網頁內容拉動。內容是xhtml和專有xml標籤的混合。 XML是合流存儲格式:

https://confluence.atlassian.com/display/DOC/Confluence+Storage+Format

自定義XML標籤被用於諸如圖像,相關鏈接和附件。如果我直接渲染內容,則自定義xml將不呈現。

我找到什麼樣子是應該的格式轉換的端點: https://docs.atlassian.com/confluence/latest/com/atlassian/confluence/xhtml/api/XhtmlContent.html

我不認爲它是不再支持。

我也發現這個項目: http://www.amnet.net.au/~ghannington/confluence/readme.html#wikifier

其中匯合XML轉換成匯合維基標記。該項目有兩個.xsl表一張是confluence2wiki.xsl它處理標記轉換,另一個是confluence2xhtml.xsl這聽起來像它會做這項工作,但不幸的是執行情況很差。它從字面上將匯合xml轉換成xml,看起來像xml。因此,從合流XML的圖像標記不幸變爲:

<div class="extension-element"> 
    <p class="extension-element-markup"> 
     <span class="element-name">ac:image</span> 
     <span class="attribute-name">ac:alt</span> 
     <span class="markup">="</span> 
     <span class="attribute-value">Example1.png</span> 
     <span class="markup">"</span> 
    </p> 
<div class="extension-element-contents"> 
    <div class="extension-element"> 
    <p class="extension-element-markup"> 
     <span class="element-name">ri:url</span> 
     <span class="attribute-name">ri:value</span> 
     <span class="markup">="</span> 
     <span class="attribute-value">https://example.com/attachments/token/2ujwb0dm4jsorgk/?name=Omniata_Docs_Projects_Example1.png</span> 
     <span class="markup">"</span> 
     </p> 
    </div> 
</div> 

這是不是非常有幫助。目前看起來我必須根據wkik xsl sheet編寫我自己的xsl表。我希望有一個較少的手動解決方案或有人以前這樣做過。

回答

0

如果您需要這樣做,使用REST API,目前最好的方法是編寫一個插件並實現您自己的REST API,爲您進行轉換。

像這樣的事情應該由存儲格式轉換成HTML開始你的方式:

public String convertStorageToView(int pageId) 
{ 
    Page page = pageManager.getById(pageId);   
    String storage = page.getBodyAsString(); 

    try 
    { 
     final ConversionContext conversionContext = new DefaultConversionContext(page.toPageContext()); 

     return xhtmlContent.convertStorageToView(storage, conversionContext); 
    } 
    catch (XhtmlException e) 
    { 
     e.printStackTrace(); 
    } 
    catch (XMLStreamException e) 
    { 
     e.printStackTrace(); 
    } 

    return null; 
} 

您還可以寫​​。

+0

我感興趣的是爲什麼這可能是downvoted。評論會很有用。 – dvdsmpsn

1

通過遠程API調用renderContent方法。如果你的內容是舊格式,還有一個convertWikiToStorageFormat方法。

0

類似它已經在另一個答案中顯示,但對我來說,你不得不使用xhtmlContent。您可以通過構造函數輕鬆獲取該實例。

public class MyServlet extends HttpServlet { 

    private Logger LOGGER = Logger.getLogger(getClass()); 

    private final PageManager pageManager; 
    private final XhtmlContent xhtmlContent; 


    public static final String PARAM_PAGE_ID = "pageId"; 


    public MyServlet(PageManager pageManager, XhtmlContent xhtmlContent) { 
    this.pageManager = pageManager; 
     this.xhtmlContent = xhtmlContent; 
    } 

    @Override 
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { 
     //fetch page or blogpost 
     ContentEntityObject page = pageManager.getPage(Long.parseLong(request.getParameter(PARAM_PAGE_ID))); 
     if (page == null) { 
      page = pageManager.getBlogPost(Long.parseLong(request.getParameter(PARAM_PAGE_ID))); 
     } 
     if (page != null) { 
      String htmlContent = ""; 
      final ConversionContext conversionContext = new DefaultConversionContext(page.toPageContext()); 
      try { 
       htmlContent = xhtmlContent.convertStorageToView(page.getBodyAsString(), conversionContext); 
      } catch (XMLStreamException e) { 
       htmlContent = "ERROR ON EXPORT"; 
       LOGGER.error(e); 
      } catch (XhtmlException e) { 
       htmlContent = "ERROR ON EXPORT"; 
       LOGGER.error(e); 
      } 

     } else { 
     //do some errorhandling here 
    } 
    //.. do something with the content .. render it in a velocity file for example 
    } 

您可以渲染速度文件中的數據或將其直接寫入響應。