Funkcja wyglądała tak (plik xmlQuery.php):
Kod
<?php
function node_content($node,$attribute="content"){
$result = array();
if (count($node->nodeset)>0) {
foreach($node->nodeset as $content){
$result[] = $content->{$attribute};
}
}
return $result;
}
function getCDATA($xml, $xpath){
$dom = domxml_open_mem($xml);
$calcX = $dom->xpath_new_context();
$xml_parsed=node_content($calcX->xpath_eval("$xpath/text()"));
return $xml_parsed;
}
function getAttributes($xml, $xpath, $att_name){
$dom = domxml_open_mem($xml);
$calcX = $dom->xpath_new_context();
$xml_parsed=node_content($calcX->xpath_eval("$xpath/attribute::$att_name",$calcX), "value");
return $xml_parsed;
}
?>
function node_content($node,$attribute="content"){
$result = array();
if (count($node->nodeset)>0) {
foreach($node->nodeset as $content){
$result[] = $content->{$attribute};
}
}
return $result;
}
function getCDATA($xml, $xpath){
$dom = domxml_open_mem($xml);
$calcX = $dom->xpath_new_context();
$xml_parsed=node_content($calcX->xpath_eval("$xpath/text()"));
return $xml_parsed;
}
function getAttributes($xml, $xpath, $att_name){
$dom = domxml_open_mem($xml);
$calcX = $dom->xpath_new_context();
$xml_parsed=node_content($calcX->xpath_eval("$xpath/attribute::$att_name",$calcX), "value");
return $xml_parsed;
}
?>
Jej wywołanie i obsługa struktury, którą generauje, wygląda tak:
Kod
<?php
include_once('xmlQuery.php');
$file = "mult.xml";
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
$data = fread($fp, filesize($file));
fclose($fp);
$producenci = getAttributes($data, '//producent', 'nazwa');
foreach ($producenci as $producent){
$logo = getAttributes($data, "//producent[@nazwa='$producent']", 'logo');
$tresc[$producent]['logo'] = $logo[0];
$mierniki = getAttributes($data, "//producent[@nazwa='$producent']/miernik", 'typ');
foreach ($mierniki as $typ){
$nazwa = getCDATA($data, "//miernik[@typ='$typ']/nazwa");
$tresc[$producent]['mierniki'][$typ]['nazwa'] = $nazwa[0];
$zdjecie = getCDATA($data, "//miernik[@typ='$typ']/zdjecie");
$tresc[$producent]['mierniki'][$typ]['zdjecie'] = (sizeof($zdjecie)>0?$zdjecie[0]:null);
}
}
print '<TABLE width="870" border="1" cellpadding="0" cellspacing="0" align="center">'."\n";
foreach ($tresc as $producent => $mierniki){
$logo = $tresc[$producent]['logo'];
print '<tr><td colspan="3" class="producent">'."\n";
print "<img src=\"m_logo/$logo\" alt=\"$producent\">"."\n";
print '</td></tr>'."\n";
$col=0;
foreach ($mierniki['mierniki'] as $typ => $miernik){
$nazwa = $miernik['nazwa'];
$zdjecie = $miernik['zdjecie'];
if ($col==0){
print '<tr>'."\n";
}
print '<TD class="miernik">'."\n";
print "<a name=\"$typ\" href=\"multimetr.php?typ=$typ\">";
if ($zdjecie != null){
print "<img src=\"miniaturki/$zdjecie\" alt=\"$nazwa\" border=\"0\">
";
}
print "$nazwa</a></td>"."\n";
$col++;
if ($col==3) {
$col=0;
print '</tr>'."\n";
}
}
if ($col!=0){
while ($col<3){
$col++;
print '<TD class="miernik"> </TD>'."\n";
}
print '</tr>'."\n";
}
}
print '</table>'."\n";
?>
include_once('xmlQuery.php');
$file = "mult.xml";
if (!($fp = fopen($file, "r"))) {
die("could not open XML input");
}
$data = fread($fp, filesize($file));
fclose($fp);
$producenci = getAttributes($data, '//producent', 'nazwa');
foreach ($producenci as $producent){
$logo = getAttributes($data, "//producent[@nazwa='$producent']", 'logo');
$tresc[$producent]['logo'] = $logo[0];
$mierniki = getAttributes($data, "//producent[@nazwa='$producent']/miernik", 'typ');
foreach ($mierniki as $typ){
$nazwa = getCDATA($data, "//miernik[@typ='$typ']/nazwa");
$tresc[$producent]['mierniki'][$typ]['nazwa'] = $nazwa[0];
$zdjecie = getCDATA($data, "//miernik[@typ='$typ']/zdjecie");
$tresc[$producent]['mierniki'][$typ]['zdjecie'] = (sizeof($zdjecie)>0?$zdjecie[0]:null);
}
}
print '<TABLE width="870" border="1" cellpadding="0" cellspacing="0" align="center">'."\n";
foreach ($tresc as $producent => $mierniki){
$logo = $tresc[$producent]['logo'];
print '<tr><td colspan="3" class="producent">'."\n";
print "<img src=\"m_logo/$logo\" alt=\"$producent\">"."\n";
print '</td></tr>'."\n";
$col=0;
foreach ($mierniki['mierniki'] as $typ => $miernik){
$nazwa = $miernik['nazwa'];
$zdjecie = $miernik['zdjecie'];
if ($col==0){
print '<tr>'."\n";
}
print '<TD class="miernik">'."\n";
print "<a name=\"$typ\" href=\"multimetr.php?typ=$typ\">";
if ($zdjecie != null){
print "<img src=\"miniaturki/$zdjecie\" alt=\"$nazwa\" border=\"0\">
";
}
print "$nazwa</a></td>"."\n";
$col++;
if ($col==3) {
$col=0;
print '</tr>'."\n";
}
}
if ($col!=0){
while ($col<3){
$col++;
print '<TD class="miernik"> </TD>'."\n";
}
print '</tr>'."\n";
}
}
print '</table>'."\n";
?>
Plik XML ma taką definicję:
Kod
<!ELEMENT mierniki (producent+)>
<!ELEMENT producent (miernik+)>
<!ELEMENT miernik (nazwa, parametry+, zdjecie?, schematy*, instrukcja?)>
<!ELEMENT nazwa (#PCDATA)>
<!ELEMENT parametry (#PCDATA)>
<!ELEMENT zdjecie (#PCDATA)>
<!ELEMENT schematy (#PCDATA)>
<!ELEMENT instrukcja (#PCDATA)>
<!ATTLIST producent nazwa CDATA #REQUIRED logo CDATA #IMPLIED>
<!ATTLIST miernik typ CDATA #REQUIRED>
<!ATTLIST schematy opis CDATA "schemat">
<!ATTLIST instrukcja opis CDATA "instrukcja">
<!ELEMENT producent (miernik+)>
<!ELEMENT miernik (nazwa, parametry+, zdjecie?, schematy*, instrukcja?)>
<!ELEMENT nazwa (#PCDATA)>
<!ELEMENT parametry (#PCDATA)>
<!ELEMENT zdjecie (#PCDATA)>
<!ELEMENT schematy (#PCDATA)>
<!ELEMENT instrukcja (#PCDATA)>
<!ATTLIST producent nazwa CDATA #REQUIRED logo CDATA #IMPLIED>
<!ATTLIST miernik typ CDATA #REQUIRED>
<!ATTLIST schematy opis CDATA "schemat">
<!ATTLIST instrukcja opis CDATA "instrukcja">
...a to jego fragment:
Kod
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<!DOCTYPE mierniki SYSTEM "mult.dtd">
<mierniki>
<producent nazwa="Energia" logo="energia_logo.gif">
<miernik typ="MUR-4">
<nazwa>MUR-4</nazwa>
<parametry>DCV: 1 2,5 10 25 100 250 (20kOhm/V)</parametry>
<parametry>ACV: 2,5 10 25 100 250 1000 (2kOhm/V)</parametry>
<parametry>DCmA: 1 2,5 10 25 100 250 1000 2500</parametry>
<parametry>200 kOhm: x0,1 x1 x10</parametry>
<parametry>200 uF: x0,01</parametry>
<zdjecie>MUR-4.jpg</zdjecie>
</miernik>
</producent>
<producent nazwa="Lumel" logo="lumel_logo.gif">
<miernik typ="LAVO-21">
<nazwa>Miernik Uniwersalny LAVO-21</nazwa>
<parametry>DCV: 0,15 0,5 1,5 5 15 50 150 500 (20kOhm/V)</parametry>
<parametry>ACV: 0,5 1,5 5 15 50 150 500 (6,32kOhm/V)</parametry>
<parametry>DCmA: 0,15 0,5 1,5 5 15 50 150 500</parametry>
<parametry>ACmA: 0,5 1,5 5 15 50 150 500</parametry>
<parametry>kOhm: 1, 100</parametry>
<zdjecie>LAVO-21.jpg</zdjecie>
<schematy opis="schemat">Lavo-21.gif</schematy>
<instrukcja opis="instrukcja">Lavo-21.djvu</instrukcja>
</miernik>
<miernik typ="LAVO-3">
<nazwa>Miernik Uniwersalny LAVO-3</nazwa>
<parametry>DCV: 0,15 3 15 60 150 300 600 (20kOhm/V)</parametry>
<parametry>ACV: 3 15 60 150 300 600 (5kOhm/V)</parametry>
<parametry>DCmA: 0,05 1,5 6 30 150 600 1500</parametry>
<parametry>ACmA: 0,2 1,5 6 30 150 600 1500</parametry>
<parametry>50 kOhm: x0,1 x1 x10</parametry>
<zdjecie>LAVO-3.jpg</zdjecie>
<schematy opis="schemat">Lavo-3.gif</schematy>
<instrukcja opis="instrukcja">Lavo-3.djvu</instrukcja>
</miernik>
</producent>
</mierniki>
<!DOCTYPE mierniki SYSTEM "mult.dtd">
<mierniki>
<producent nazwa="Energia" logo="energia_logo.gif">
<miernik typ="MUR-4">
<nazwa>MUR-4</nazwa>
<parametry>DCV: 1 2,5 10 25 100 250 (20kOhm/V)</parametry>
<parametry>ACV: 2,5 10 25 100 250 1000 (2kOhm/V)</parametry>
<parametry>DCmA: 1 2,5 10 25 100 250 1000 2500</parametry>
<parametry>200 kOhm: x0,1 x1 x10</parametry>
<parametry>200 uF: x0,01</parametry>
<zdjecie>MUR-4.jpg</zdjecie>
</miernik>
</producent>
<producent nazwa="Lumel" logo="lumel_logo.gif">
<miernik typ="LAVO-21">
<nazwa>Miernik Uniwersalny LAVO-21</nazwa>
<parametry>DCV: 0,15 0,5 1,5 5 15 50 150 500 (20kOhm/V)</parametry>
<parametry>ACV: 0,5 1,5 5 15 50 150 500 (6,32kOhm/V)</parametry>
<parametry>DCmA: 0,15 0,5 1,5 5 15 50 150 500</parametry>
<parametry>ACmA: 0,5 1,5 5 15 50 150 500</parametry>
<parametry>kOhm: 1, 100</parametry>
<zdjecie>LAVO-21.jpg</zdjecie>
<schematy opis="schemat">Lavo-21.gif</schematy>
<instrukcja opis="instrukcja">Lavo-21.djvu</instrukcja>
</miernik>
<miernik typ="LAVO-3">
<nazwa>Miernik Uniwersalny LAVO-3</nazwa>
<parametry>DCV: 0,15 3 15 60 150 300 600 (20kOhm/V)</parametry>
<parametry>ACV: 3 15 60 150 300 600 (5kOhm/V)</parametry>
<parametry>DCmA: 0,05 1,5 6 30 150 600 1500</parametry>
<parametry>ACmA: 0,2 1,5 6 30 150 600 1500</parametry>
<parametry>50 kOhm: x0,1 x1 x10</parametry>
<zdjecie>LAVO-3.jpg</zdjecie>
<schematy opis="schemat">Lavo-3.gif</schematy>
<instrukcja opis="instrukcja">Lavo-3.djvu</instrukcja>
</miernik>
</producent>
</mierniki>
Z góry dziękuję za pomoc w dostosowaniu skryptu xmlQuery.php do PHP5.