当前位置: 首页 > 知识库问答 >
问题:

如何从xom XML文档创建DatabaseChangeLog?

袁华清
2023-03-14

在进行了一些程序内操作之后,我最终得到了一个包含我要执行的变更日志的xom文档对象。根据我的理解,我必须在ChangeLogParser的帮助下将其转换为liquibase XML格式ParsedNode。但该接口在parse方法中假设一个外部表示形式。使用ResourceAccessor将Document对象注入解析器也是不可能的,因为方法getResourcesAsStream返回一组InputStream。因此,我能想到的使用liquibase基础设施的唯一方法是执行一个文档,打印成一个字符串,然后通过ByteArrayInputStream将其反馈回来。或者我需要编写一个独立的Document->ParsedNode转换器吗?

共有1个答案

祖奇
2023-03-14
import liquibase.changelog.DatabaseChangeLog;
import liquibase.exception.SetupException;
import liquibase.parser.core.ParsedNode;
import liquibase.parser.core.ParsedNodeException;
import liquibase.resource.ClassLoaderResourceAccessor;
import nu.xom.Document;
import nu.xom.Element;
import nu.xom.Elements;
import org.apache.commons.lang3.StringUtils;

/**
 * Convert a xom Document containing a liquibase changelog
 * to a DatabaseChangeLog.
 */
public class XOMDocumentToDatabaseChangeLogConverter {
    /**
     * Convert the Document ot a DatabaseChangeLog.
     * @param changeLogXML to convert.
     * @return contained changelog.
     * @throws SetupException on error.
     * @throws ParsedNodeException on error.
     */
    public static DatabaseChangeLog convert(Document changeLogXML) throws SetupException, ParsedNodeException {
        DatabaseChangeLog result = new DatabaseChangeLog();
        result.setPhysicalFilePath("");
        Element rootElement = changeLogXML.getRootElement();
        result.load(convert(rootElement), new ClassLoaderResourceAccessor());
        return result;
    }

    /**
     * Internal recursive method doing the node rollup.
     * @param element to convert.
     * @return converted node.
     * @throws ParsedNodeException on error.
     */
    protected static ParsedNode convert(Element element) throws ParsedNodeException {
        ParsedNode node = new ParsedNode(null, element.getLocalName());
        for (int i = 0; i < element.getAttributeCount(); ++i) {
            node.addChild(null, element.getAttribute(i).getLocalName(), element.getAttribute(i).getValue());
        }
        String seenText = element.getValue();
        if (!StringUtils.trimToEmpty(seenText).equals("")) {
            node.setValue(seenText.trim());
        }

        Elements children = element.getChildElements();
        for (int i = 0; i < children.size(); ++i) {
            node.addChild(convert(children.get(i)));
        }

        return node;
    }
}
 类似资料:
  • 问题内容: 如何从XML文档或Node对象中创建要在xstream中使用的InputStream对象?我需要更换??? 带有一些有意义的代码。谢谢。 问题答案:

  • 问题内容: 我在应用程序中对函数和我尝试过的包godoc -html以及应用程序和结果创建了简单的注释 为什么我没有看到其他文件?以及为什么包的空格 问题答案: 默认情况下,未记录未导出的标识符。至少设置为查看它们: 可以使用“ m” URL参数来控制godoc服务的网页的显示方式;它接受以逗号分隔的标志名称列表作为值: ones methods show all embedded methods

  • 创建 markdown 文档,文件名为 greeting.md,并将该文档放置于 docs 目录下。 website # 网站根目录 ├── docs │   └── greeting.md ├── src │   └── pages ├── docusaurus.config.js ├── ... 在文档顶部的 front matter 中设置 id 和 title 属性,以便

  • 我在用iText7做游戏。净c#。我正在尝试在内存中创建一个多页PDF文档(n页数),其中源PDF文档只包含一页。 我可以用一页创建一个新文档,但无法根据需要创建额外的页面。我试过了 但我得到了一个ArgumentOutOfRange例外。。。索引超出范围。。。等 我试图关闭destPdfDoc,然后重新打开它,认为第二页直到我关闭它才被写入。但是当第二次打开destPdfDoc时,它没有页面。我

  • 问题内容: 我想使用Python创建Word文档,但是,我想尽可能多地重用现有的文档创建代码。我目前正在使用XSLT生成HTML文件,并以编程方式将其转换为PDF文件。但是,我的客户现在要求以Word(.doc)格式提供同一文档。 到目前为止,我没有太多运气找到该问题的解决方案。有谁知道可以帮助解决此问题的开源库(或 gulp 专有解决方案)? 注意:所有可能的解决方案必须在Linux上运行。我相

  • 主要内容:在CouchDB数据库中使用Fauxton创建文档,CouchDB使用cURL实用程序创建文档在CouchDB中,数据库的数据以文档的形式而不是表格存储。 在CouchDB数据库中使用Fauxton创建文档 要在CouchDB数据库中创建文档,请打开Fauxton url: 选择特定的数据库,假设在数据库:上创建文档,先点击数据库链接进入数据概览。 点击新文档(New Document),如下图所示: 然后就会打开一个页面,默认只有一个字段:,但是可以通点击”Add Field“来新增