我想将一个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
));
}
?>
非常感谢!
答案 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)
结果:
Click here for demo (updated) - scroll to bottom to see results