使用子节点将XML导入SQL(使用php和xpath)

时间:2017-08-05 08:05:30

标签: php sql-server xml dom xpath

我想将一个XML文件导入SQL。 XML文件有很多 scrutin ,每个都代表一个程序集中的一个投票。请在下面找到一个文件样本,其中只有两个 scrutin

<scrutins>
<scrutin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<uid>VTANR5L14V1353</uid>
<numero>1353</numero>
<ventilationVotes>
                        <nonVotants>
                            <votant>
                                <acteurRef>PA381</acteurRef>
                                <mandatRef>PM645125</mandatRef>
                                <causePositionVote>PAN</causePositionVote>
                            </votant>
                            <votant>
                                <acteurRef>PA1592</acteurRef>
                                <mandatRef>PM645232</mandatRef>
                                <causePositionVote>PSE</causePositionVote>
                            </votant>
                        </nonVotants>
                        <pours>
                            <votant>
                                <acteurRef>PA1155</acteurRef>
                                <mandatRef>PM645285</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA2859</acteurRef>
                                <mandatRef>PM645087</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA695</acteurRef>
                                <mandatRef>PM645503</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA1886</acteurRef>
                                <mandatRef>PM645099</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA1979</acteurRef>
                                <mandatRef>PM645223</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA608083</acteurRef>
                                <mandatRef>PM645142</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA332384</acteurRef>
                                <mandatRef>PM645528</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA267923</acteurRef>
                                <mandatRef>PM645120</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA331924</acteurRef>
                                <mandatRef>PM701034</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609332</acteurRef>
                                <mandatRef>PM645147</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA341246</acteurRef>
                                <mandatRef>PM645469</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA605643</acteurRef>
                                <mandatRef>PM645405</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA606412</acteurRef>
                                <mandatRef>PM645400</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA606555</acteurRef>
                                <mandatRef>PM645477</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA606363</acteurRef>
                                <mandatRef>PM645388</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA606924</acteurRef>
                                <mandatRef>PM645527</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA607310</acteurRef>
                                <mandatRef>PM645297</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA607892</acteurRef>
                                <mandatRef>PM645460</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA608172</acteurRef>
                                <mandatRef>PM645197</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609042</acteurRef>
                                <mandatRef>PM645076</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA608785</acteurRef>
                                <mandatRef>PM645567</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA608920</acteurRef>
                                <mandatRef>PM645060</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609435</acteurRef>
                                <mandatRef>PM645211</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609691</acteurRef>
                                <mandatRef>PM645296</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610066</acteurRef>
                                <mandatRef>PM645059</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609816</acteurRef>
                                <mandatRef>PM645334</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610313</acteurRef>
                                <mandatRef>PM645122</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA607369</acteurRef>
                                <mandatRef>PM645318</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610529</acteurRef>
                                <mandatRef>PM645192</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610594</acteurRef>
                                <mandatRef>PM645185</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610758</acteurRef>
                                <mandatRef>PM645301</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610905</acteurRef>
                                <mandatRef>PM645225</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA642836</acteurRef>
                                <mandatRef>PM676799</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA342332</acteurRef>
                                <mandatRef>PM676816</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA643205</acteurRef>
                                <mandatRef>PM701215</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA643002</acteurRef>
                                <mandatRef>PM703297</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA642736</acteurRef>
                                <mandatRef>PM711657</mandatRef>
                            </votant>
                        </pours>
                        <contres>
                            <votant>
                                <acteurRef>PA331753</acteurRef>
                                <mandatRef>PM645348</mandatRef>
                            </votant>
                        </contres>

</ventilationVotes>
<miseAuPoint xsi:nil="true"/>
</scrutin>
<scrutin xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<uid>VTANR5L14V1354</uid>
<numero>1354</numero>
<ventilationVotes>
                        <nonVotants>
                            <votant>
                                <acteurRef>PA381</acteurRef>
                                <mandatRef>PM645125</mandatRef>
                                <causePositionVote>PAN</causePositionVote>
                            </votant>
                            <votant>
                                <acteurRef>PA1592</acteurRef>
                                <mandatRef>PM645232</mandatRef>
                                <causePositionVote>PSE</causePositionVote>
                            </votant>
                        </nonVotants>
                        <pours>
                            <votant>
                                <acteurRef>PA1155</acteurRef>
                                <mandatRef>PM645285</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA1214</acteurRef>
                                <mandatRef>PM645446</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA695</acteurRef>
                                <mandatRef>PM645503</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA1844</acteurRef>
                                <mandatRef>PM645254</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA2503</acteurRef>
                                <mandatRef>PM645187</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA335532</acteurRef>
                                <mandatRef>PM714818</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA605643</acteurRef>
                                <mandatRef>PM645405</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA606363</acteurRef>
                                <mandatRef>PM645388</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA606924</acteurRef>
                                <mandatRef>PM645527</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA606623</acteurRef>
                                <mandatRef>PM645513</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA607310</acteurRef>
                                <mandatRef>PM645297</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA607892</acteurRef>
                                <mandatRef>PM645460</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609435</acteurRef>
                                <mandatRef>PM645211</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609691</acteurRef>
                                <mandatRef>PM645296</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610066</acteurRef>
                                <mandatRef>PM645059</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610313</acteurRef>
                                <mandatRef>PM645122</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA609314</acteurRef>
                                <mandatRef>PM645145</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610529</acteurRef>
                                <mandatRef>PM645192</mandatRef>
                            </votant>
                            <votant>
                                <acteurRef>PA610758</acteurRef>
                                <mandatRef>PM645301</mandatRef>
                            </votant>
                        </pours>
                        <contres/>

</ventilationVotes>
</scrutin>
</scrutins>

acteurRef 在此文件中表示投票人的ID。要理解他投票的内容,你必须采用他的父节点的父节点( pours 为赞成, contres 为反对, nonVotants 因为没投票。)

我希望从这个文件中提取每个投票的SQL表。每个 acteurRef 都会连续出现。一列将显示他的投票内容( pours contres 等),另一列将显示 uid ,代表id每次投票( scrutin )。

请附上我开始编写的PHP代码:

   <?php
     $xpath = simplexml_load_file('test_1353_1354.xml');

       foreach ($xpath->scrutin as $scrutins) {
            $uid = $scrutins->uid;
            $acteurRef = $scrutins->xpath('//acteurRef')[];

            echo $uid.'<br/>';
            echo $acteurRef;


            $sql = $sql2->prepare("INSERT INTO xml (uid, acteurRef) VALUES 
               (:uid, :acteurRef)");
            $sql->execute(array('uid' => $uid, 'acteurRef' => $acteurRef 
                ));

    }
   ?>

非常感谢!

1 个答案:

答案 0 :(得分:0)

假设@x是存储在XML数据之上的T-SQL变量(数据类型XML),那么我将使用以下查询来提取数据:

SELECT  DENSE_RANK() OVER(ORDER BY x.XmlCol)            AS ScrutinNum,
        x.XmlCol.value('(uid/text())[1]', 'VARCHAR(50)')AS [uid],
        y.XmlCol.value('local-name(.)', 'NVARCHAR(50)') AS Something,
        z.XmlCol.value('(text())[1]', 'VARCHAR(50)')    AS acteurRef_InnerText
FROM    @x.nodes('scrutins/*:scrutin') x(XmlCol) 
OUTER APPLY x.XmlCol.nodes('ventilationVotes/*') y(XmlCol) -- It takes all child nodes of ventilationVotes
OUTER APPLY y.XmlCol.nodes('votant/acteurRef') z(XmlCol)

结果:

enter image description here

Click here for demo (updated) - scroll to bottom to see results