2009-05-23 123 views
7

我有一個解析MySQL存儲過程中簡單的XML格式的字符串的任務。 XML看起來像這樣(僅用於測試目的):解析MySQL中的XML字符串

<parent> 
    <child>Example 1</child> 
    <child>Example 2</child> 
</parent> 

我需要MySQL做的是每個匹配產生一個結果集一行。我的存儲過程的代碼如下所示:

DECLARE xmlDoc TEXT; 
SET xmlDoc = '<parent><child>Example 1</child><child>Example 2</child></parent>'; 
SELECT ExtractValue(xmlDoc, '//child'); 

這個做什麼,但是,是不是串接所有的比賽,產生「例1例2」。順便說一下,這是有文件記載的,但卻是無用的行爲。

我能做些什麼來使它返回行中的匹配,而不必計算匹配並逐個處理它們? MySQL甚至有可能嗎?

謝謝大家!

回答

7
DECLARE i INT DEFAULT 1; 
DECLARE count DEFAULT ExtractValue(xml, 'count(//child)'); 

WHILE i <= count DO 
    SELECT ExtractValue(xml, '//child[$i]'); 
    SET i = i+1; 
END WHILE 

或者......

DECLARE v VARCHAR(500) DEFAULT ''; 
DECLARE i INT DEFAULT 1; 

REPEAT 
    SET v = ExtractValue(xml, '//child[$i]') 
    SET i = i+1; 
    IF v IS NOT NULL THEN 
     -- do something with v 
    END IF 
UNTIL v IS NULL 

很抱歉,如果語法是在這裏有點沙基,沒有太大的MySQL的大師......

8

這需要一個行集生成功能,以及MySQL缺乏它。

您可以使用一個虛擬表或子查詢,而不是:

SELECT ExtractValue(@xml, '//mychild[[email protected]]'), 
     @r := @r + 1 
FROM (
     SELECT @r := 1 
     UNION ALL 
     SELECT 1 
     ) vars 

注意會話變量XPath5.2被打破,支持(但5.1正常工作)

+0

這工作相當好。謝謝。 – 2009-05-25 01:37:18

1

下面是一個存儲過程例如使用while循環讀取xml

-- drop procedure testabk; 
-- call testabk(); 
delimiter // 
create procedure testabk() 
begin 

DECLARE k INT UNSIGNED DEFAULT 0; 
DECLARE xpath TEXT; 
declare doc varchar(1000); 
DECLARE row_count1 INT UNSIGNED; 

set doc='<StaticAttributesBM><AttributeId id="11">Status</AttributeId><AttributeId id="2">Reason</AttributeId><AttributeId id="3">User Remarks</AttributeId></StaticAttributesBM>'; 
DROP TABLE IF EXISTS tempStaticKeywords; 
CREATE TABLE tempStaticKeywords(id int, staticKeywords VARCHAR(500)); 
SET row_count1 := extractValue(doc,'count(/StaticAttributesBM/AttributeId)'); 
select row_count1; 

-- iterate over books 
WHILE k < row_count1 DO   
    SET k := k + 1; 
    SET xpath := concat('/StaticAttributesBM/AttributeId[', k, ']'); 
    INSERT INTO tempStaticKeywords(id,staticKeywords) VALUES (
     extractValue(doc, concat(xpath,'/@id')), 
     extractValue(doc, xpath)  
    ); 
END WHILE; 

select * from tempStaticKeywords; 

END 
// 

輸出低於

ID staticKeywords

1狀態

2原因

3用戶備註