2014-02-13 41 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 
    } 

您可以渲染速度文件中的数据或将其直接写入响应。