下記のサンプルは、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>