Witajcie.
Potrzebuję sparsować xml przy użyciu xpath. Xml z grubsza wygląda tak:
<RESULT>
<INFO_NAME>text1</INFO_NAME>
<INFO_VALUE>500</INFO_VALUE>
<INFO_NAME>text2</INFO_NAME>
<INFO_VALUE>12</INFO_VALUE>
<INFO_NAME>text3</INFO_NAME>
<INFO_VALUE>400</INFO_VALUE>
<INFO_NAME>text4</INFO_NAME>
<INFO_VALUE>60</INFO_VALUE>
</RESULT>
Poradziłem sobie z tym w następujący sposób:
select unnest(xpath('INFO_NAME/text()',x.node))::text infoname,
unnest(xpath('INFO_VALUE/text()',x.node))::text infovalue
from (SELECT unnest(xpath('//RESULT', axml)) node
Wszystko fajnie zadziałało jeśli ilość NAME pokrywa się z ilością VALUE. W przypadku gdy NAME mam np 4, a VALUE mam tylo 3 węzły to wtedy robi się kartezjan ... w pythonie jest taka fajna funkcja o nazwie nextsibling, która pobiera kolejny węzeł. Niestety w postgresql nie znalazłem czegoś takiego. Macie pomysł jak to ugryźć?
Dla ułatwienia poprawny:
http://sqlfiddle.com/#!17/047a1/4
i niepoprawny
http://sqlfiddle.com/#!17/047a1/5