正在使用 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
条目到这个文件。从示例中可以看出,可能有也可能没有回滚文件。我怎样才能做到这一点? (id
、author
和 path
将作为参数传递)
第一个问题是您是要改变现有文档还是创建一个新文档。
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")
我有一个 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
条目到这个文件。从示例中可以看出,可能有也可能没有回滚文件。我怎样才能做到这一点? (id
、author
和 path
将作为参数传递)
第一个问题是您是要改变现有文档还是创建一个新文档。
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")