---
title: "hämta från xml till array"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/70690-hämta-från-xml-till-array"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "elvelind"
published: "2003-03-11T00:55:26.000Z"
updated: "2003-03-17T12:30:31.000Z"
replies: 11
views: 346
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/70690-hämta-från-xml-till-array"
---

# hämta från xml till array

## #1 — elvelind, 2003-03-11T00:55Z

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

Permalänk: https://www.webforum.nu/p/70690

## #2 — pimme, 2003-03-11T07:49Z

<http://se.php.net/manual/en/ref.xml.php> kanske?

Permalänk: https://www.webforum.nu/p/975212

## #3 — jarvklo, 2003-03-11T10:49Z

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>

Permalänk: https://www.webforum.nu/p/975298

## #4 — elvelind, 2003-03-11T12:03Z

dom är olika. ska kolla in koden.

Permalänk: https://www.webforum.nu/p/975382

## #5 — Darren, 2003-03-11T12:11Z

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.

Permalänk: https://www.webforum.nu/p/975389

## #6 — elvelind, 2003-03-11T14:02Z

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.

Permalänk: https://www.webforum.nu/p/975507

## #7 — Darren, 2003-03-11T16:56Z

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>

Permalänk: https://www.webforum.nu/p/975662

## #8 — Darren, 2003-03-11T17:43Z

Kolla om detta fungerar:

```php
<?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.

Permalänk: https://www.webforum.nu/p/975705

## #9 — elvelind, 2003-03-15T13:51Z

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

Permalänk: https://www.webforum.nu/p/978321

## #10 — jarvklo, 2003-03-16T19:42Z

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

Permalänk: https://www.webforum.nu/p/981948

## #11 — elvelind, 2003-03-17T10:01Z

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

Permalänk: https://www.webforum.nu/p/982222

## #12 — jarvklo, 2003-03-17T12:30Z

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

?>
```

Permalänk: https://www.webforum.nu/p/982314

---

Tråden på webben: https://www.webforum.nu/amne/php/70690-hämta-från-xml-till-array
