webForumDet fria alternativet

hämta från xml till array

11 svar · 339 visningar · startad av elvelind

elvelindMedlem sedan juli 2002167 inlägg
#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?.

pimmeMedlem sedan sep. 20011 086 inlägg
jarvkloMedlem sedan juli 20013 378 inlägg
#3

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

elvelindMedlem sedan juli 2002167 inlägg
#4

dom är olika. ska kolla in koden.

DarrenMedlem sedan dec. 2002789 inlägg
#5

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.

elvelindMedlem sedan juli 2002167 inlägg
#6

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.

DarrenMedlem sedan dec. 2002789 inlägg
#7

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

DarrenMedlem sedan dec. 2002789 inlägg
#8

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.

elvelindMedlem sedan juli 2002167 inlägg
#9

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>.

jarvkloMedlem sedan juli 20013 378 inlägg
#10

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 &gt; och &lt; 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...

elvelindMedlem sedan juli 2002167 inlägg
#11

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å)

jarvkloMedlem sedan juli 20013 378 inlägg
#12

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>';

?>
261 ms totalt · 3 externa anrop · v20260731065814-full.fb544a5a
0 ms — hämta forumlista (cache)
127 ms — hämta statistik (db)
132 ms — hämta tråd, inlägg och bilagor (db)