使用extractValue从MySql中的元素获取值

使用extractValue从MySql中的元素获取值,mysql,Mysql,我有以下xml <EmployeeList> <Employee> <EmpID>11</EmpID> <EmpName>ABC</EmpName> </Employee> <Employee> <EmpID>12</EmpID> <EmpName>XYZ</EmpName> </Employee&g

我有以下xml

<EmployeeList>
  <Employee>
    <EmpID>11</EmpID>
    <EmpName>ABC</EmpName>
  </Employee>
  <Employee>
    <EmpID>12</EmpID>
    <EmpName>XYZ</EmpName>
  </Employee>
</EmployeeList>

11
基础知识
12
XYZ
我想根据Employee表中的Employee计数插入元素值

我有一个employee表,其中id和name作为列

我得到了下面的代码片段

declare xml_content text;
declare v_row_index int unsigned default 0;   
declare v_row_count int unsigned;  
declare v_xpath_row varchar(255); 

set xml_content = load_file(path);

-- calculate the number of row elements.   
set v_row_count  = extractValue(xml_content, concat('count(', node, ')')); 

-- loop through all the row elements    
while v_row_index < v_row_count do                
    set v_row_index = v_row_index + 1;        
    set v_xpath_row = concat(node, '[', v_row_index, ']/@*');
    insert into applicants values (
        extractValue(xml_content, concat(v_xpath_row, '[1]')),
        extractValue(xml_content, concat(v_xpath_row, '[2]'))
    );
end while;
声明xml\u内容文本;
声明v_row_index int无符号默认值为0;
声明v_row_count int无符号;
声明v_xpath_row varchar(255);
设置xml_内容=加载_文件(路径);
--计算行元素的数量。
设置v_row_count=extractValue(xml_内容,concat('count(',node'));
--循环遍历所有行元素
当v_行索引
以上仅适用于属性值

到目前为止,我所做的是:

-- loop through all the row elements    
    while v_row_index < v_row_count do                
        set v_row_index = v_row_index + 1;        
        set v_xpath_row = concat(node, '[', v_row_index, ']/@*');
set @I=1,@j=2;
        insert into applicants values (
            extractValue(xml_content, '//Employee[$@i]'),
            extractValue(xml_content, '//Employee[$@j]')
        );
    end while;
--遍历所有行元素
当v_行索引
我想做什么:

我有一个如上所述的xml。 其中有两条员工记录。
要在Employee表中插入这些内容,可以创建一个过程,如图所示,从XML中读取并插入到表中:

DELIMITER $$
CREATE PROCEDURE `import_applicant_xml`()
BEGIN
    declare path varchar(255);
    declare node varchar(255);
    declare xml_content text;
    declare v_row_index int unsigned default 0;   
    declare v_row_count int unsigned;  
    declare v_empID varchar(255); 
    declare v_empName varchar(255); 
    set path = 'C:\\demo\\employee.xml';
    set node = 'Employee';
    set xml_content = load_file(path);

    -- calculate the number of row elements.   
    set v_row_count  = extractValue(xml_content, concat('count(//', node, ')')); 
    -- loop through all the row elements    
    while v_row_index < v_row_count do                
        set v_row_index = v_row_index + 1;        
        set v_empID = concat('//',node, '[', v_row_index, ']/EmpID');
        set v_empName = concat('//',node, '[', v_row_index, ']/EmpName');
        insert into employee values (
            extractValue(xml_content,v_empID),
            extractValue(xml_content, v_empName)
        );
    end while;
END
分隔符$$
创建过程“导入申请人xml”()
开始
声明路径varchar(255);
声明节点varchar(255);
声明xml_内容文本;
声明v_row_index int无符号默认值为0;
声明v_row_count int无符号;
声明v_empID varchar(255);
声明v_empName varchar(255);
设置路径='C:\\demo\\employee.xml';
设置节点='Employee';
设置xml_内容=加载_文件(路径);
--计算行元素的数量。
设置v_row_count=extractValue(xml_content,concat('count(//',node'));
--循环遍历所有行元素
当v_行索引

您可以将路径和节点值作为参数中的
传递给过程,使其更具动态性。

什么版本的MySQL?你考虑过吗?MySQL 5.5版。虽然LOAD XML不能在存储过程中使用,因为它是sql存储过程向MySQL的迁移,但我只能在存储过程中进行更改。MySQL不允许在存储过程中使用“LOAD XML INLINE语句…”。道歉。我不知道。我自己也试过了,你是对的。我以你的XML为样本来测试代码,你可能需要更改XPath声明以满足你的需求。我可以在这里做一些节点方面的泛型吗。在我的情况下,我已经将xml元素作为文本传递,因此没有用于传递节点的额外参数。有没有函数,我可以说是父节点,它给了我所有的子节点值。例如,我想做的是:extractValue(xml_content,//Employee[$@I]),@Malcolm我不确定是否可以获得子节点列表,您可以像这样获得Employee的子节点计数:
set v_child_count=extractValue(xml_content,concat(//',count node,[1]/*))
以及以后您可以访问子级,如:
set v_empID=concat(“//”,node,“[”,v_row_index,“]/*[1]”);设置v_empName=concat(“//”,节点“[”,v_行索引“]/*[2]”)可以用变量替换上述注释中的[1]和[2]。