下記のサンプルは、Berkeley DBXML .NET Edition APIを利用して、XMLドキュメントの作成、保存、取得、検索、クエリなどの使い方を示します。また、複雑のXMLクエリを対応しているサンプルも挙げます。
Create XmlContainer
public void CreateContainer() { dirHome = @"c:\temp"; DbEnvironmentConfig eConfig=DbEnvironmentConfig.CreateDefaultConfig(); dbEnv=new DbEnvironment(dirHome,eConfig); XmlManager.SetLogLevel(LogLevel.All, true); XmlManager.SetLogCategory(LogCategory.All, true); XmlManagerConfig xmlManagerConfig = new XmlManagerConfig(); xmlManagerConfig.AllowExternalAccess = true; xmlManager = new XmlManager(dbEnv, xmlManagerConfig); XmlContainerConfig config = new XmlContainerConfig(); config.AllowValidation = false; config.ContainerType = XmlContainerType.WholeDocContainer; XmlTransaction xmlTransaction = xmlManager.CreateTransaction(); xmlContainer = xmlManager.CreateContainer(xmlTransaction, containerName, config); xmlTransaction.Commit(); xmlUpdateContext = xmlManager.CreateUpdateContext(); docConfig=new XmlDocumentConfig(); xmlQueryContext = xmlManager.CreateQueryContext(); }
Put XmlDocument, query and get XmlDocument
public void CreateLocalFileInputStreamUTF8() { string filename = @"..\..\input\UTF-8.xml"; xmlInputStream = xmlManager.CreateLocalFileInputStream(filename); XmlTransaction txn = xmlManager.CreateTransaction(); xmlContainer.PutDocument(txn, filename, xmlInputStream, xmlUpdateContext, docConfig); txn.Commit(); xmlInputStream.Dispose(); txn.Dispose(); txn = xmlManager.CreateTransaction(); Console.WriteLine("Document Numbers = " + xmlContainer.GetNumDocuments(txn)); string xpath ="/NewsML/InMClass1[text()=\"レース電文\"]"; string myQuery = "collection('" + containerName + "')" + xpath ; xmlQueryContext.ReturnType = XmlQueryContextReturnType.LiveValues; XmlQueryExpression qe = xmlManager.Prepare(txn, myQuery,xmlQueryContext); XmlResults xmlResults = qe.Execute(txn, xmlQueryContext); while(xmlResults.MoveNext()) { XmlDocument rDoc = xmlResults.Current.ToDocument(); Console.WriteLine(rDoc.StringContent); Console.WriteLine(xmlResults.Current.ToString()); rDoc.Dispose(); } xmlResults.Dispose(); qe.Dispose(); txn.Commit(); txn.Dispose(); }
Call external function in xquery
public void XmlExternalFunction() { try { // Create an XmlManager XmlManager mgr = new XmlManager(); // Create an function resolver FunResolverImpl resolver = new FunResolverImpl(); // Register the function resolver to XmlManager mgr.RegisterResolver(resolver); XmlQueryContext context = mgr.CreateQueryContext(); // Set the prefix URI context.SetNamespace("my", resolver.GetUri()); for(int i=1; i<=100; i++) { // Query that calls the external function pow() // The function must be declared in the query's preamble String query1 = "declare function " + "my:pow($a as xs:double, $b as xs:double) as xs:double external;\n" + "my:pow(" + i + "," + 3 + ")"; // Query call external sqrt() function String query2 = "declare function " + "my:sqrt($a as xs:double) as xs:double external;\n" + "my:sqrt(" + i + ")"; XmlResults results = mgr.Query(query1, context); // The first query returns the result of pow(i,3) while (results.MoveNext()) { XmlValue va = results.Current; double value = va.ToNumber(); String output = i + "^3 = " + value; Console.WriteLine(output); Assert.AreEqual(Math.Pow(i, 3), value); } // The second query returns the result of sqrt(i) results = mgr.Query(query2, context); while (results.MoveNext()) { XmlValue va = results.Current; double value = va.ToNumber(); String output = "Sqrt(" + i + ") = " + value; Console.WriteLine(output); Assert.AreEqual(Math.Sqrt(i), value); } } // If the resolver reuse XmlExternalFunction objects, it is responsible for // eventually calling delete() resolver.Dispose(); } catch (XmlException ex) { Console.WriteLine(ex); throw; } }
Encryption with password
private const string password = "日本語パスワード"; DbEnvironmentConfig eConfig = DbEnvironmentConfig.CreateDefaultConfig(); eConfig.EncryptedPassword = password;
Create compressed XmlContainer
// Register user's compression object into XmlManager XmlCompressionImpl compressor = new XmlCompressionImpl(); mgr.RegisterCompression(compressionName, compressor); containerConfig = new XmlContainerConfig(); containerConfig.ContainerType = XmlContainerType.WholeDocContainer; containerConfig.Transactional = false; // Set XmlContainerConfig custom compression containerConfig.CompressionName = (compressionName); cont = mgr.CreateContainer(containerName2, containerConfig);
Some XQuery examples
for $x in doc('MyContainer.dbxml/doc')/bookstore/book
return if ($x/@category=\"CHILDREN\")
then <child>{data($x/title)}</child>
else <adult>{data($x/title)}</adult>
for $i in doc('SenkyoData.dbxml/${DOCNAME}')/NewsML/NewsItem/NewsComponent
let $Title :=$i/NewsLines/HeadLine
let $Date :=$i/ContentItem/DataContent/InContent/InMetadata/InAdminInfo/InDateTime
let $BClass :=$i/ContentItem/DataContent/InContent/InMetadata/InCategoryInfo/InClasses/InClass/InBClass
let $MClass1 :=$i/ContentItem/DataContent/InContent/InMetadata/InCategoryInfo/InClasses/InClass/InMClass1
let $MClass2 :=$i/ContentItem/DataContent/InContent/InMetadata/InCategoryInfo/InClasses/InClass/InMClass2
let $DtdFormat :=$i/ContentItem/Format/@FormalName
let $ProductId :=$i/ContentItem/DataContent/InContent/InMetadata/InAdminInfo/InProductId
let $EditLine :=$i/ContentItem/DataContent/InContent/InMetadata/InNewsInfo/InEditInfo/InEditLines/InEditLine
let $ModifyLine := $i/ContentItem/DataContent/InContent/InMetadata/InAdminInfo/InModifyInfo
let $Shusanbetsu :=$i/ContentItem/DataContent/InContent/InData/SenkyokuKaihyo/KyotsuJoho/Shusanbetsu
let $Senkyoshubetsu :=$i/ContentItem/DataContent/InContent/InData/SenkyokuKaihyo/KyotsuJoho/Senkyoshubetsu
let $SenkyoKaiSu :=$i/ContentItem/DataContent/InContent/InData/SenkyokuKaihyo/KyotsuJoho/SenkyoKaiSu
where $DtdFormat='KdELSG1v1.0'
return
<ELSG1>
<Summary>
<Title>{data($Title)}</Title>
<Date>{data($Date)}</Date>
<BClass>{data($BClass)}</BClass>
<MClass1>{data($MClass1)}</MClass1>
<MClass2>{data($MClass2)}</MClass2>
<DtdFormat>{data($DtdFormat)}</DtdFormat>
<ProductId>{data($ProductId)}</ProductId>
<EditLine>{data($EditLine)}</EditLine>
<ModifyLine>{data($ModifyLine)}</ModifyLine>
<Shusanbetsu>{data($Shusanbetsu)}</Shusanbetsu>
<Senkyoshubetsu>{data($Senkyoshubetsu)}</Senkyoshubetsu>
<SenkyoKaiSu>{data($SenkyoKaiSu)}</SenkyoKaiSu>
</Summary>
{
for $b in $i/ContentItem/DataContent/InContent/InData/SenkyokuKaihyo/SenkyokuJoho
let $FukenCode := $b/Fuken/@Code
let $Fuken := $b/Fuken
let $TeiSu := $b/TeiSu
let $TeiSuHenko := $b/TeiSuHenko
let $KohoSu := $b/KohoSu
let $YukenshaSu := $b/YukenshaSu
let $YukenshaSu_Kakutei := $b/YukenshaSu/@Kakutei
let $TohyoshaSu := $b/TohyoshaSu
let $TohyoshaSu_Kakutei := $b/TohyoshaSu/@Kakutei
let $TohyoRitsu := $b/TohyoRitsu
let $KaihyoRitsu:= $b/KaihyoRitsu
let $SenShu := $b/SenShu
let $SenShu_SashikaeFlag := $b/SenShu/@SashikaeFlag
let $SenShu_SashikaeKaiSu := $b/SenShu/@SashikaeKaiSu
let $ZenkaiJoho := $b/ZenkaiJoho
return
<SenkyokuJoho>
<FukenCode>{data($FukenCode)}</FukenCode>
<Fuken>{data($Fuken)}</Fuken>
<TeiSu>{data($TeiSu)}</TeiSu>
<TeiSuHenko>{data($TeiSuHenko)}</TeiSuHenko>
<KohoSu>{data($KohoSu)}</KohoSu>
<YukenshaSu>{data($YukenshaSu)}</YukenshaSu>
<YukenshaSu_Kakutei>{data($YukenshaSu_Kakutei)}</YukenshaSu_Kakutei>
<TohyoshaSu>{data($TohyoshaSu)}</TohyoshaSu>
<TohyoshaSu_Kakutei>{data($TohyoshaSu_Kakutei)}</TohyoshaSu_Kakutei>
<TohyoRitsu>{data($TohyoRitsu)}</TohyoRitsu>
<KaihyoRitsu>{data($KaihyoRitsu)}</KaihyoRitsu>
<SenShu>{data($SenShu)}</SenShu>
<SenShu_SashikaeFlag>{data($SenShu_SashikaeFlag)}</SenShu_SashikaeFlag>
<SenShu_SashikaeKaiSu>{data($SenShu_SashikaeKaiSu)}</SenShu_SashikaeKaiSu>
<ZenkaiJoho>{data($ZenkaiJoho)}</ZenkaiJoho>
<KohoJohos>
{
for $h in $b/KohoJoho2
let $TodokedeBango := $h/TodokedeBango
let $KohoId := $h/@KohoId
let $Sei := $h/Sei
let $Mei := $h/Mei
let $SeitoMeiCode := $h/SeitoMei/@Code
let $SeitoMei := $h/SeitoMei
let $Genshinbetsu := $h/Genshinbetsu
let $TokuhyoSu := $h/TokuhyoSu[empty(@HoteiTokuhyo) and empty(KyotakukinBosshu)]
let $HoteiTokuhyo := $h/TokuhyoSu[@HoteiTokuhyo='1']
let $KyotakukinBosshu := $h/TokuhyoSu[@KyotakukinBosshu='1']
let $TokuhyoRitsu := $h/TokuhyoRitsu
let $SenkyokuToraku := $h/SenkyokuToraku
let $SenkyokuToraku_RuikeiSu := $h/SenkyokuToraku/@RuikeiSu
let $SenkyokuToraku_Torikeshi := $h/SenkyokuToraku/@Torikeshi
let $ShashinLink := $h/ShashinLink/@FileName
return
<KohoJoho>
<KohoId>{data($KohoId)}</KohoId>
<TodokedeBango>{data($TodokedeBango)}</TodokedeBango>
<Sei>{data($Sei)}</Sei>
<Mei>{data($Mei)}</Mei>
<SeitoMeiCode>{data($SeitoMeiCode)}</SeitoMeiCode>
<SeitoMei>{data($SeitoMei)}</SeitoMei>
<Genshinbetsu>{data($Genshinbetsu)}</Genshinbetsu>
<TokuhyoSu>{data($TokuhyoSu)}</TokuhyoSu>
<HoteiTokuhyo>{data($HoteiTokuhyo)}</HoteiTokuhyo>
<KyotakukinBosshu>{data($KyotakukinBosshu)}</KyotakukinBosshu>
<TokuhyoRitsu>{data($TokuhyoRitsu)}</TokuhyoRitsu>
<SenkyokuToraku>{data($SenkyokuToraku)}</SenkyokuToraku>
<SenkyokuToraku_RuikeiSu>{data($SenkyokuToraku_RuikeiSu)}</SenkyokuToraku_RuikeiSu>
<SenkyokuToraku_Torikeshi>{data($SenkyokuToraku_Torikeshi)}</SenkyokuToraku_Torikeshi>
<ShashinLink>{data($ShashinLink)}</ShashinLink>
</KohoJoho>
}</KohoJohos>
</SenkyokuJoho>
}
</ELSG1>
ジャナ・ビジネス・コンサルティング