<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    朋的博客

    MySQL資料,Java技術(shù),管理思想,博弈論,Ajax,XP極限編程,H.264,HEVC,HDR
    隨筆 - 86, 文章 - 59, 評(píng)論 - 1069, 引用 - 0
    數(shù)據(jù)加載中……

    MySQL 5.1 提供XML內(nèi)置支持(XPath)

    前些天說(shuō)到了MySQL5提供了內(nèi)置的XML文件解析和修改函數(shù),今天找了點(diǎn)MySQL網(wǎng)站上的資料和例子,翻譯了一下,希望能給使用數(shù)據(jù)庫(kù)存儲(chǔ)XML和XSLT的同志一些幫助。
    MySQL 5.1.5版本中添加了對(duì)XML文檔進(jìn)行查詢和修改的函數(shù),分別是ExtractValue()和UpdateXML(),下面是這兩個(gè)函數(shù)的使用示例:
    還是一樣我們首先建立一個(gè)示例數(shù)據(jù)庫(kù),然后將范例中使用的XML文檔輸入到數(shù)據(jù)庫(kù)中:
    CREATE TABLE x (doc VARCHAR(150));
    INSERT INTO x VALUES
    ('
    <book>
    <title>A guide to the SQL standard</title>
    <author>
    <initial>CJ</initial>
    <surname>Date</surname>
    </author>
    </book>
    ');
    INSERT INTO x VALUES
    ('
    <book>
    <title>SQL:1999</title>
    <author>
    <initial>J</initial>
    <surname>Melton</surname>
    </author>
    </book>
    ');
    大家可以看到,doc列的內(nèi)容中包含了自己的層次結(jié)構(gòu),以XML格式體現(xiàn)包含書名和作者的書本,其中作者還包含名字簡(jiǎn)寫大寫以及姓。這是流行的排版和儲(chǔ)存格式,字母"<book>" 和</book>"是標(biāo)記,使用戶更容易理解內(nèi)部的層次結(jié)構(gòu)。
    下面先看看ExtractValue()的用法吧
    語(yǔ)法:
    EXTRACTVALUE (XML_document, XPath_string);
    第一個(gè)參數(shù):XML_document是String格式,為XML文檔對(duì)象的名稱,文中為Doc
    第二個(gè)參數(shù):XPath_string (Xpath格式的字符串) ,如果不了解Xpath語(yǔ)法,可以在網(wǎng)上查找教程。
    作用:從目標(biāo)XML中返回包含所查詢值的字符串
    示例#E1:
    mysql> SELECT EXTRACTVALUE(doc,'/book/author/initial') FROM x;
    +------------------------------------------+
    | EXTRACTVALUE(doc,'/book/author/initial') |
    +------------------------------------------+
    | CJ |
    | J |
    +------------------------------------------+
    2 rows in set (0.01 sec)
    可以看到,EXTRACTVALUE()函數(shù)將/book/author/initial節(jié)點(diǎn)中的值取出來(lái),并通過Select返回。因此需要簡(jiǎn)單的查找XML文檔中的值,只要在XPath_string參數(shù)中指定好層次和節(jié)點(diǎn)就行了。
    示例#E2
    mysql> SELECT EXTRACTVALUE(doc,'/*/*/initial') FROM x;
    +----------------------------------+
    | EXTRACTVALUE(doc,'/*/*/initial') |
    +----------------------------------+
    | CJ |
    | J |
    +----------------------------------+
    2 rows in set (0.01 sec)
    如果查詢前并不知道層次關(guān)系,你也可以使用通配符進(jìn)行層次的匹配,不過當(dāng)XML文檔比較大的時(shí)候查找速度會(huì)很慢滴。
    示例#E3
    mysql> SELECT extractValue(doc,'/book/child::*') FROM x;
    +---------------------------------------------+
    | extractValue(doc,'/book/child::*') |
    +---------------------------------------------+
    | A guide to the SQL standard |
    | SQL:1999 |
    +---------------------------------------------+
    2 rows in set (0.00 sec)
    使用/book/child::語(yǔ)句我們可以找到Book節(jié)點(diǎn)下的首個(gè)節(jié)點(diǎn),文中是title。除了child以外,我們還有其他的參數(shù):
    child ... 指定節(jié)點(diǎn)的下一子節(jié)點(diǎn))
    descendant ... 節(jié)點(diǎn)下包含的所有層次中的數(shù)據(jù)
    parent ... 指定節(jié)點(diǎn)的上一節(jié)點(diǎn)
    ancestor ... 節(jié)點(diǎn)以上所有層次的數(shù)據(jù)
    following-sibling ... 同一層次的下一個(gè)節(jié)點(diǎn)
    preceding-sibling ... 同一層次的上一個(gè)節(jié)點(diǎn)
    self ... 自身
    示例#E4
    mysql> select
    extractValue(doc,'/book/author/surname[self:text()="Date"]') from x;
    +--------------------------------------------------------------+
    | extractValue(doc,'/book/author/surname[self:text()="Date"]') |
    +--------------------------------------------------------------+
    | Date |
    | |
    +--------------------------------------------------------------+
    2 rows in set (0.00 sec)
    這里是一個(gè)使用條件表達(dá)式進(jìn)行數(shù)據(jù)查找的例子,具體就不解釋了,都是符合Xpath語(yǔ)法的,大家可以參考一下Xpath表達(dá)式的用法。
    雖然上面的extractValue()函數(shù)都使用在SELECT列表中,其實(shí)該函數(shù)是可以使用在任何一個(gè)允許使用表達(dá)式的語(yǔ)句中的。
    這里提示一點(diǎn),使用這個(gè)函數(shù)可以輕松將XML文檔列與全文檢索結(jié)合起來(lái)。
    來(lái)到UpdateXML()函數(shù)了
    語(yǔ)法
    UPDATEXML (XML_document, XPath_string, new_value);
    第一個(gè)參數(shù):XML_document是String格式,為XML文檔對(duì)象的名稱,文中為Doc
    第二個(gè)參數(shù):XPath_string (Xpath格式的字符串) ,如果不了解Xpath語(yǔ)法,可以在網(wǎng)上查找教程。
    第三個(gè)參數(shù):new_value,String格式,替換查找到的符合條件的數(shù)據(jù)
    作用:改變文檔中符合條件的節(jié)點(diǎn)的值
    示例#U1
    mysql> select UpdateXML(doc,'/book/author/initial','!!') from x;
    +----------------------------------------------------------+
    | UpdateXML(doc,'/book/author/initial','!!') |
    +----------------------------------------------------------+
    |
    <book>
    <title>A guide to the SQL standard</title>
    <author>
    !!
    <surname>Date</surname>
    </author>
    </book> |
    |
    <book>
    <title>SQL:1999</title>
    <author>
    !!
    <surname>Melton</surname>
    </author>
    </book> |
    +----------------------------------------------------------+
    2 rows in set (0.00 sec)
    UpdateXML函數(shù)的前兩個(gè)參數(shù)用法以及寫法與ExtractValue是一樣的,因?yàn)檫@里需要查找到符合條件的數(shù)據(jù)節(jié)點(diǎn)。第三個(gè)參數(shù)就是為了替換節(jié)點(diǎn)字符串的。文中我們就使用!!字符串替換了book/author/initial節(jié)點(diǎn)的值。返回值是整個(gè)改變后的XML文檔。這里記住,由于我們使用的是Select語(yǔ)句,因此并沒有對(duì)真正的數(shù)據(jù)進(jìn)行修改,而是在內(nèi)存中將取出的數(shù)據(jù)進(jìn)行修改然后返回給用戶。如果需要徹底的修改文檔內(nèi)容,可以使用下面語(yǔ)句:
    UPDATE x SET doc = UpdateXML(doc,/book/author/initial','!!');
    細(xì)心的人也許發(fā)現(xiàn)這里有一個(gè)錯(cuò)誤,也許是Bug,因?yàn)槲覀儾⒉幌胄薷慕Y(jié)構(gòu)化的文檔,而僅僅需要修改內(nèi)容,但UpdateXML函數(shù)將<initial>CJ></initial>整個(gè)文本改成了!!,這樣就不是我們所想要的了,因?yàn)樗淖兞苏麄€(gè)文檔結(jié)構(gòu)。因此如果你需要的僅僅是修改這個(gè)結(jié)構(gòu)化文檔的內(nèi)容部分,而不是整個(gè)文本,可以使用:
    UpdateXML(doc,'/book/author/initial','<initial>!!</initial>') from x;
    示例#U2
    mysql> select
    extractvalue(
    UpdateXML(doc,'/book/author/initial','<initial>!!</initial>'),'/book/author/
    initial') from x;
    +---------------------------------------------------------------------------
    --------------------------+
    |
    extractvalue(
    UpdateXML(doc,'/book/author/initial','<initial>!!</initial>'),'/book/author/
    initial') |
    +---------------------------------------------------------------------------
    --------------------------+
    | !!
    |
    | !!
    |
    +---------------------------------------------------------------------------
    --------------------------+
    2 rows in set (0.01 sec)
    最后一個(gè)例子,ExtractValue()函數(shù)和UpdateXML()函數(shù)的嵌套使用,結(jié)果是給我們展示將initial節(jié)點(diǎn)的值改成!!后選擇查詢initial節(jié)點(diǎn)的內(nèi)容,結(jié)果大家也能看到了。
    上面只是這兩個(gè)函數(shù)的最基本用法,如果大家還需要更多的資料,或有一些自己的心得,歡迎一起討論。

    posted on 2006-07-11 00:12 benchensz 閱讀(10955) 評(píng)論(9)  編輯  收藏 所屬分類: 隨便寫寫(比較有用,值得看看)

    評(píng)論

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    令人振奮。謝謝樓主了。呵呵。
    2006-07-11 08:54 | rox

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    用XML會(huì)不會(huì)影響數(shù)據(jù)庫(kù)的性能
    2006-07-12 18:21 | 楊一

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    應(yīng)該不會(huì)
    我試了一下,基本沒有變化
    2006-07-13 15:18 | dudududu

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    不知道和Hibernate3對(duì)XML到數(shù)據(jù)庫(kù)的支持有什么優(yōu)劣?
    2006-11-21 17:33 | 呂品

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    你知道如何添加一個(gè)節(jié)點(diǎn)到加一個(gè)節(jié)點(diǎn)下嗎?我是說(shuō)不影響其它元素的情況下,比如,
    <a>
    <b>bValue</b>
    <c>cValue</c>
    </a>

    變成

    <a>
    <b>bValue</b>
    <b>bValue2</b>
    <c>cValue</c>
    </a>

    ??
    2007-11-12 10:07 | shazi

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    據(jù)我所知還沒有直接進(jìn)行XML節(jié)點(diǎn)插入的語(yǔ)法,但建議使用UpdateXML函數(shù)對(duì)父節(jié)點(diǎn)進(jìn)行更新。
    2007-11-12 16:22 | chenpengyi

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    沒有XML節(jié)點(diǎn)抽取的功能,不爽。
    2008-04-12 13:50 | lewis

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    extractvalue()只能讀取節(jié)點(diǎn)的值,而不能抽取整個(gè)節(jié)點(diǎn)。
    2008-04-12 13:52 | lewis

    # re: MySQL 5.1 提供XML內(nèi)置支持(XPath)  回復(fù)  更多評(píng)論   

    看了你的例子,總覺得還是在修改表x,并沒有修改和操作XML文檔
    2010-06-07 16:09 | 什么
    主站蜘蛛池模板: 国产v精品成人免费视频400条| 精品剧情v国产在免费线观看| 亚洲一卡2卡4卡5卡6卡残暴在线| 99re热免费精品视频观看| 亚洲av永久无码精品秋霞电影秋| 亚洲日韩在线第一页| **毛片免费观看久久精品| 亚洲成a∨人片在无码2023| 亚洲一区二区精品视频| 91短视频免费在线观看| MM1313亚洲精品无码久久| 国产成人亚洲综合无码精品| 最近最新的免费中文字幕| 毛片基地看看成人免费| 亚洲一区二区三区写真| 亚洲高清国产AV拍精品青青草原| 中字幕视频在线永久在线观看免费| 污网站在线免费观看| 亚洲国产精品线观看不卡| 最新精品亚洲成a人在线观看| aⅴ免费在线观看| 国产大片免费天天看| 在线亚洲高清揄拍自拍一品区| 久久久久亚洲精品无码网址| 久久国产免费福利永久| eeuss草民免费| 亚洲精品无码久久久久YW| 亚洲国产成人一区二区三区| 免费a级毛片无码av| 野花高清在线电影观看免费视频| yellow视频免费看| 亚洲av永久中文无码精品综合 | 亚洲av乱码一区二区三区香蕉| 亚洲电影日韩精品| 国产情侣激情在线视频免费看| 中国精品一级毛片免费播放| 在线观看亚洲精品专区| 亚洲一区二区三区丝袜| 中文字幕亚洲色图| 亚洲级αV无码毛片久久精品| 亚洲精品尤物yw在线影院|