E elvelind Medlem sedan juli 2002 167 inlägg Frågan 11 mars 2003 00:55 #1 sitter och funderar på det smidigaste sättet att lösa ett litet problem jag har.
Jag har en XMl fil som jag vill läsa in till två arrayer. allt mellan <pattern></pattern> taggar ska gå till första och allt mellan <replacement></replacement> ska gå till andra. taggarna. kan innehålla både text och childelement.
någon som har nån smidig lösning?.
P pimme Medlem sedan sep. 2001 1 086 inlägg J jarvklo Medlem sedan juli 2001 3 378 inlägg Hmm...
Är childelementen lika eller olika taggarna? (förekommer t.ex. <childelement> i både <pattern> och <replacement>) ?
Om de är olika borde du enkelt kunna bygga på idéerna i kodexemplet i http://www.webforum.nu/showthread.php?s=&postid=428844#post428844
E elvelind Medlem sedan juli 2002 167 inlägg dom är olika. ska kolla in koden.
D Darren Medlem sedan dec. 2002 789 inlägg Jag skulle använda mig av DOMXML för PHP om jag vore du... :)
Om du visar XML filen så kan jag kanske hjälpa dig lite mer.
E elvelind Medlem sedan juli 2002 167 inlägg det skulle jag med Darren :)
men är för förvirrad med XUL och Python programering just nu för att komma ihåg det minsta lilla php syntax ;)
xml filen är iallafall som följer
<?xml version="1.0" encoding="iso-8859-1"?>
<replacements>
<friend>
<pattern>/\bvän\b/i</pattern>
<replace><a href="http://vän.com/">\\0</a></replace>
</friend>
<acronym>
<pattern>/\bcss\b/i</pattern>
<replace><acronym title="Cascading stylesheet">\\0</acronym></replace>
</acronym>
.......
osv
.......
</replacements>
det jag vill ha är en array innehållandes alla pattern taggar och en innehållandes alla replace taggar.
D Darren Medlem sedan dec. 2002 789 inlägg Titta lite på artikeln jag skrev för phpportalen. Den kan nog hjälpa dig.
Om du fastnar någonstans, hör av dig så fixar vi det.
Artikeln: http://www.phpportalen.net/wiki/index.php?page=XML+parsing+med+XMLDOM+och+PHP
D Darren Medlem sedan dec. 2002 789 inlägg Kolla om detta fungerar:
<?php
$xmlfile = "minxml.xml";
if(!$dom = domxml_open_file($xmlfile)) {
echo "Error while parsing the document\n";
exit;
}
// Ta tag i dokumentet
$root = $dom->document_element();
// Hämta alla pattern noder
$pattern = $root->get_elements_by_tagname("pattern");
// Hämta alla replace noder
$replace = $root->get_elements_by_tagname("replace");
$pattern_array = array();
for ($a = 0; $a < sizeof($pattern); $a++){
$pattern_array[$a] = utf8_decode($pattern[$a]->get_content());
}
echo "<h3>Pattern array:</h3>";
print_r($pattern_array);
$replace_array = array();
for ($a = 0; $a < sizeof($replace); $a++){
$replace_array[$a] = utf8_decode($replace[$a]->get_content());
}
echo "<h3>Replace array:</h3>";
print_r($replace_array);
?>
Läs artikeln på phpportalen för att se hur du aktiverar DOMXML i php.
E elvelind Medlem sedan juli 2002 167 inlägg efter mycket om och men har jag fått tid att testa scriptet och det fungerar bra så länge det inte finns några childelement till pattern och replace. hur gör jag för att få med dessa med? replace kommer nämligen ofta innehålla saker som <a href="">\\0</a>.
J jarvklo Medlem sedan juli 2001 3 378 inlägg Kruxet är att "<" och ">" är reserverade tecken i XML och de får därför inte finnas i "löpande text" i XML hursomhelst...
Normalt skulle man antagligen kunna lösa problemet med att lägga in dem som > och < i texten, men frågan är hur det funkar i just ditt sammanhang...
Ett annat sätt att lägga in dessa tecken är att lägga dem i en CDATA-sektion, typ
<pattern><![CDATA[<a href="">\\0</a>]]></pattern>
vilket ger ett avsnitt där du kan använda även < och > fritt...
E elvelind Medlem sedan juli 2002 167 inlägg jarvklo: löst det tillfälligt på just det sättet. (fick självklart dock strippa bort ett \ från \\0 eftersom jag inte behöver escapa längre då)
J jarvklo Medlem sedan juli 2001 3 378 inlägg OK...
Är pattern och replace välutformad XML, så kan du kanske använda nånting i stil med det här för att permanenta det hela ;) :
<?php
function startElement($parser, $name, $attrs=''){
global $current_tag, $current_pattern_index, $current_replace_index, $my_pattern, $my_replace;
switch($name){
case 'pattern':
$current_pattern_index+=1;
$current_tag = "pattern";
break;
case 'replace':
$current_replace_index+=1;
$current_tag = "replace";
break;
default:
if ($current_tag == "pattern") {
$my_pattern[$current_pattern_index] .= "<$name";
foreach ( $attrs as $name => $value ) {
$my_pattern[$current_pattern_index] .= " $name=$value";
}
$my_pattern[$current_pattern_index] .= ">";
}
else if ($current_tag == "replace") {
$my_replace[$current_replace_index] .= "<$name";
foreach ( $attrs as $name => $value ) {
$my_replace[$current_replace_index] .= " $name=\"$value\"";
}
$my_replace[$current_replace_index] .= ">";
}
break;
}
}
function endElement($parser, $name, $attrs=''){
global $current_tag, $current_pattern_index, $current_replace_index, $my_pattern, $my_replace;
switch($name){
case 'pattern':
case 'replace':
$current_tag = "--";
break;
default:
if ($current_tag == "pattern") {
$my_pattern[$current_pattern_index] .= "</$name>";
}
else if ($current_tag == "replace") {
$my_replace[$current_replace_index] .= "</$name>";
}
break;
}
}
function characterData($parser, $data){
global $current_tag, $current_pattern_index, $current_replace_index, $my_pattern, $my_replace;
switch($current_tag){
case 'pattern':
if (isset($my_pattern[$current_pattern_index])) {
$my_pattern[$current_pattern_index].=$data;
}
else {
$my_pattern[$current_pattern_index] = $data;
}
break;
case 'replace':
if (isset($my_replace[$current_replace_index])) {
$my_replace[$current_replace_index].=$data;
}
else {
$my_replace[$current_replace_index] = $data;
}
break;
default:
break;
}
}
$xml_file = 'elvelind.xml';
$type = 'UTF-8';
$xml_parser = xml_parser_create($type);
xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false);
xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
xml_set_element_handler($xml_parser, 'startElement','endElement');
xml_set_character_data_handler($xml_parser, 'characterData');
if (!($fp = fopen($xml_file, 'r'))) {
die("Could not open $xml_file for parsing!\n");
}
$current_index=0;
while ($data = fread($fp, 4096)) {
if (!($data = utf8_encode($data))) {
echo 'ERROR'."\n";
}
if (!xml_parse($xml_parser, $data, feof($fp))) {
die("XML error".xml_error_string(xml_get_error_code($xml_parser)));
}
}
xml_parser_free($xml_parser);
// Nu har du de två array:erna med överensstämmande index
// (dvs $my_pattern[n] hör till $my_replace[n] )
echo '<table border="1">';
echo '<tr><th>Pattern</th><th>Replace</th></tr>';
foreach ( $my_pattern as $key => $value ) {
echo "<tr>";
echo "<td>".htmlspecialchars($value)."</td>";
echo "<td>".htmlspecialchars($my_replace[$key])."</td>";
echo "</tr>\n";
}
echo'</table><hr>';
?>