正在使用 FSharp XMLProvider 解析 XML 文件

Parsing XML file with FSharp XMLProvider

我有一个 XML 文件 sample.xml 如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
            http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.8.xsd">

    <changeSet author="x" id="y">
        <sqlFile
            endDelimiter="\nGO"
            path="ChangeSetScripts/1.sql"
            relativeToChangelogFile="true"
            splitStatements="true"
            stripComments="false"/>
        <rollback>
            <sqlFile path="ChangeSetScripts/1_rollback.sql" />
        </rollback>
    </changeSet>

    <changeSet author="a" id="b">
        <sqlFile
            endDelimiter="\nGO"
            path="ChangeSetScripts/2.sql"
            relativeToChangelogFile="true"
            splitStatements="true"
            stripComments="false"/>
    </changeSet>

    <changeSet author="p" id="q">
        <sqlFile
            endDelimiter="\nGO"
            path="ChangeSetScripts/3.sql"
            relativeToChangelogFile="true"
            splitStatements="true"
            stripComments="false"/>
        <rollback>
            <sqlFile path="ChangeSetScripts/5_rollback.sql" />
        </rollback>
    </changeSet>
    
    ...

</databaseChangeLog>

我想使用 F# XMLProvider 添加一个新的 changeSet 条目到这个文件。从示例中可以看出,可能有也可能没有回滚文件。我怎样才能做到这一点? (idauthorpath 将作为参数传递)

第一个问题是您是要改变现有文档还是创建一个新文档。 XML 提供程序生成的类型是不可变的,因此如果您创建一个新文档,它会更好地工作,但是底层的 XElement 对象可能会发生变化,因此您也可以这样做。

要创建一个新的修改文档,您只需使用提供的类型来构造一个新的 DatabaseChangeLog 值和新的 ChangeSet 列表:

type Log = XmlProvider<"c:/temp/sample.xml">
let doc = Log.Load("c:/temp/sample.xml")

// Create a new changeset and specify all required values
let changeSet =
  Log.ChangeSet("New Author", "new_id", 
    Log.SqlFile("/", "c:/path", false, false, false), None)

// Create a new file with the new changeset
let changeSets = Array.append doc.ChangeSets [| changeSet |]  
let newFile = Log.DatabaseChangeLog(doc.SchemaLocation, doc.ChangeSets)

// To get the new XML document as a string before saving it
newFile.ToString()

编辑: 如果您想将新的 changeSet 添加到现有文档中,方法如下:

doc.XElement.Add(changeSet.XElement)
doc.XElement.Save("sample.xml")