Zadejte hledaný výraz...

Převod XML na Xpath

Taps
verified
rating uzivatele
(118 hodnocení)
19. 8. 2021 20:59:22
Zdravím, mám xml soubor s namespace a potřeboval bych z něj vygenerovat xpath.Nemáte nějaký nápad jak na to?
Zkoušel jsem použít tento skript https://gist.github.com/Divi/9003769, ale ten mi bohužel nefunguje v případě, že je v xml použit namespace
Děkuji
19. 8. 2021 20:59:22
https://webtrh.cz/diskuse/prevod-xml-na-xpath/#reply1489094
TomasX
verified
rating uzivatele
(4 hodnocení)
20. 8. 2021 01:13:51
a co s tímhle chceš dělat? Ten kód nepodporuje celou řadu xml syntaxí, neošetřuje chyby na vstupu, nedělá sanitizaci xml, takže to bude pořád jen "tak nějak". Jak přidat podporu namespace do xpath máš vesměs dvě cesty, používat : notaci nebo využívat funkci local-name() u tagu a tím ignorovat namespace. Vybral jsem si tu první možnost a odkázaný kód upravil, to "ns" je vlastně konstanta, vznikne pak xpath typu /ns:root/ns:node/ns:foo, jen je potřeba danou namespace vědět dopředu, protože při dotazování jí musíš registrovat právě pod tu konstantu "ns", pokud jí nevíš, můžeš si jí z SimpleXmpIterator sám vytáhnout, to už ti ale psát nebudu.
// this function will show the full xpath of an XML file
// your code
$xml = new SimpleXMLIterator('fooBarbar');
$xpath = xmlToXPath($xml);
// example of use xpath with ns
$ns_alias='ns';
$xmlns = new SimpleXMLIterator('fooBarbar');
$xpathns = xmlToXPath($xmlns, $ns_alias);
$xmlns->registerXPathNamespace($ns_alias, 'http://www.webtrh.cz/');
//$xmlns->xpath(...)
// the magic function
// from http://php.net/manual/fr/class.simplexmliterator.php#111916
function xmlToXPath($xml, $ns = null, $key = null, &$tmp = null)
{
$keys_arr = array();
// Get the keys count array
for ($xml->rewind(); $xml->valid(); $xml->next()) {
$sk = $xml->key();
if (array_key_exists($sk, $keys_arr)) {
$keys_arr+=1;
$keys_arr = $keys_arr;
}
else {
$keys_arr = 1;
}
}
// Create the xpath
for ($xml->rewind(); $xml->valid(); $xml->next()) {
$sk = $xml->key();
if (!isset($$sk)) {
$$sk = 1;
}
if ($keys_arr >= 1) {
$spk = $sk . '';
$keys_arr = $keys_arr - 1;
$$sk++;
}
else {
$spk = $sk;
}
if($ns) {
$kp = $key ? $key . '/' . $ns . ':' . $spk : '/' . $ns . ':' . $xml->getName() . '/' . $ns . ':' . $spk;
} else {
$kp = $key ? $key . '/' . $spk : '/' . $xml->getName() . '/' . $spk;
}
if ($xml->hasChildren()) {
xmlToXPath($xml->getChildren(), $ns, $kp, $tmp);
}
else {
$tmp = strval($xml->current());
}
$at = $xml->current()->attributes();
if ($at) {
$tmp_kp = $kp;
foreach ($at as $k => $v) {
$kp .= '/@' . $k;
$tmp = $v;
$kp = $tmp_kp;
}
}
}
return $tmp;
}
20. 8. 2021 01:13:51
https://webtrh.cz/diskuse/prevod-xml-na-xpath/#reply1489093
Taps
verified
rating uzivatele
(118 hodnocení)
21. 8. 2021 17:00:13
Děkuji, takto mi to stačí. Převod do xpath jsem potřeboval pro jeden SW
21. 8. 2021 17:00:13
https://webtrh.cz/diskuse/prevod-xml-na-xpath/#reply1489092
Pro odpověď se přihlašte.
Přihlásit