Berkeley DBXML .NET Edition API Examples

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