downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

XML hatalarıya ilgilenmek> <Örnekler
[edit] Last updated: Fri, 23 Dec 2011

view this page in

Temel kullanım

Bu eklentideki bir çok örnek bir XML dizge gerektirir. Her örnekte bu dizgeyi tekrar tekrar yazmak yerine her örnekte içerilmek üzere bir dosyaya koyduk. Bu dosyanın içeriği aşağıda verilmiştir. İsterseniz kendi XML belgenizi oluşturup simplexml_load_file() işleviyle de okutabilirsiniz.

Örnek 1 - XML dizge olarak içerilecek example.php dosyası

<?php
$xmlstr 
= <<<XML
<?xml version='1.0' standalone='yes'?>
<movies>
 <movie>
  <title>PHP: Behind the Parser</title>
  <characters>
   <character>
    <name>Ms. Coder</name>
    <actor>Onlivia Actora</actor>
   </character>
   <character>
    <name>Mr. Coder</name>
    <actor>El Act&#211;r</actor>
   </character>
  </characters>
  <plot>
   So, this language. It's like, a programming language. Or is it a
   scripting language? All is revealed in this thrilling horror spoof
   of a documentary.
  </plot>
  <great-lines>
   <line>PHP solves all my web problems</line>
  </great-lines>
  <rating type="thumbs">7</rating>
  <rating type="stars">5</rating>
 </movie>
</movies>
XML;
?>

Basit XML eklentisinin basitleştiriciliği, en açık haliyle basit bir XML belgeden bir sayı veya dizgeyi çıkarırken görülür.

Örnek 2 - <plot> içeriğinin eldesi

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie[0]->plot// "So this language. It's like..."
?>

Bir XML belgedeki elemanlara erişirken, PHP isimlendirme kurallarına uymayan (örneğin, tire içeren) eleman isimleri tek tırnak ve kaşlı ayraçlarla sarmalanarak belirtilebilir.

Örnek 3 - <line> içeriğinin eldesi

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

echo 
$xml->movie->{'great-lines'}->line// "PHP solves all my web problems"
?>

Örnek 4 - Bir elemanın birden fazla örneğine erişim

Bir ebeveyn elemanın aynı isimdeki birden fazla çocuğunun içeriğini elde etmek için normal yineleme teknikleri kullanılır.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* Her <movie> düğümündeki <plot> içeriğini çıkaralım */
foreach ($xml->movie as $movie) {
   echo 
$movie->plot'<br />';
}

?>

Örnek 5 - Özniteliklerin kullanımı

Şimdiye kadar hep eleman isimleri ve içerikleri ile çalıştık. Basit XML eklentisi eleman özniteliklerine de erişir. Eleman özniteliklerine, eleman ismini taşıyan dizinin anahtarları olarak erişebilirsiniz.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

/* İlk <movie> içindeki <rating> düğümlerine erişelim.
 * İstatistiksel sonuçları çıktılayalım. */
foreach ($xml->movie[0]->rating as $rating) {
    switch((string) 
$rating['type']) { // Öznitelikler birer anahtardır
    
case 'thumbs':
        echo 
$rating' onaylı';
        break;
    case 
'stars':
        echo 
$rating' yıldızlı';
        break;
    }
}
?>

Örnek 6 - Elemanları ve öznitelikleri karşılaştırmak

Bir elemanı veya özniteliği bir dizge ile karşılaştırmak veya bir dizge gerektiren bir işleve aktarmak için nesnenin önüne (string) getirerek tür dönüşümü yapmalısınız. Aksi takdirde PHP, elemanı bir nesne olarak ele alır.

<?php
include 'example.php';

$xml = new SimpleXMLElement($xmlstr);

if ((string) 
$xml->movie->title == 'PHP: Behind the Parser') {
    print 
'My favorite movie.';
}

htmlentities((string) $xml->movie->title);
?>

Örnek 7 - İki elemanı karşılaştırmak

İki SimpleXMLElement nesnesi, aynı elemana ait olsalar bile, PHP 5.2.0'dan beri farklı nesneler olarak ele alınırlar.

<?php
$el1 
= new SimpleXMLElement($xmlstr);
$el2 = new SimpleXMLElement($xmlstr);
var_dump($el1 == $el2); // PHP 5.2.0'dan sonra FALSE
?>

Örnek 8 - XPath kullanımı

Basit XML eklentisinin yerleşik XPath desteği vardar. Tüm <character> elemanlarını bulmak isteyelim:

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

foreach (
$xml->xpath('//character') as $character) {
    echo 
$character->name'played by '$character->actor'<br />';
}
?>

'//character' ifadesindeki '//' bir kısaltma olup, belgedeki tüm character elemanları anlamına gelir (Bakınız: » XML Adresleme Dili (XPath) 1.0 belirtimi).

Örnek 9 - Değer atamak

SimpleXMLElement nesnesinin verileri birer sabit değildir. Nesnenin tüm elemanlarında değişiklik yapılabilir.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$xml->movie[0]->characters->character[0]->name 'Miss Coder';

echo 
$xml->asXML();
?>

Yukarıdaki kod, özgün belgedeki 'Ms. Coder' dizgesinin yerine 'Miss Coder' dizgesini yerleştirerek yeni bir XML belge çıktılar.

Örnek 10 - Eleman ve öznitelik eklemek

PHP 5.1.3'ten beri, SimpleXMLElement nesnesine çocuk elemanlar ve öznitelikler eklenebilmektedir.

<?php
include 'example.php';
$xml = new SimpleXMLElement($xmlstr);

$character $xml->movie[0]->characters->addChild('character');
$character->addChild('name''Mr. Parser');
$character->addChild('actor''John Doe');

$rating $xml->movie[0]->addChild('rating''PG');
$rating->addAttribute('type''mpaa');

echo 
$xml->asXML();
?>

Yukarıdaki kod, özgün belgeye yeni elemanlar ve öznitelikler ekleyerek yeni bir XML belge çıktılar.

Örnek 11 - DOM ile çalışabilirlik

PHP, XML düğümlerin Basit XML ve DOM biçemleri arasında dönüşüm yapılabilmeyi sağlayan bir mekanizmaya sahiptir. Bu örnekte bir DOM elemanının bir SimpleXMLElement nesnesine dönüştürülmesi gösterilmiştir.

<?php
$dom 
= new domDocument;
$dom->loadXML('<books><book><title>blah</title></book></books>');
if (!
$dom) {
     echo 
'Belge çözümlenirken hata oluştu';
     exit;
}

$s simplexml_import_dom($dom);

echo 
$s->book[0]->title;
?>



XML hatalarıya ilgilenmek> <Örnekler
[edit] Last updated: Fri, 23 Dec 2011
 
add a note add a note User Contributed Notes Temel kullanım
mishagale at fastmail dot fm 12-Jan-2012 06:12
When running example #4 on the command line, I got this output:

$ php-cgi phpsimplexmltest.php
X-Powered-By: PHP/5.3.6-13ubuntu3.3
Content-type: text/html

Ms. Coder played by Onlivia Actora
Mr. Coder played by El ActÓr

Note that the &#211; HTML entity has been automatically translated into its unicode equivalent. This is a violation of the XML spec, as the only entities that it recognises (unless you manually define more in your DTD or schema) are

<!ENTITY lt     "&#38;#60;">
<!ENTITY gt     "&#62;">
<!ENTITY amp    "&#38;#38;">
<!ENTITY apos   "&#39;">
<!ENTITY quot   "&#34;">

http://www.w3.org/TR/REC-xml/#sec-predefined-ent

This means, that if you want to send unicode text to a website which doesn't support it, the standard trick of encoding it using HTML entities won't work, if that website is using SimpleXML
gkokmdam at zonnet dot nl 23-Feb-2011 06:54
A quick tip on xpath queries and default namespaces. It looks like the XML-system behind SimpleXML has the same workings as I believe the XML-system .NET uses: when one needs to address something in the default namespace, one will have to declare the namespace using registerXPathNamespace and then use its prefix to address the otherwise in the default namespace living element.

<?php
$string
= <<<XML
<?xml version='1.0'?>
<document xmlns="http://www.w3.org/2005/Atom">
 <title>Forty What?</title>
 <from>Joe</from>
 <to>Jane</to>
 <body>
  I know that's the answer -- but what's the question?
 </body>
</document>
XML;

$xml = simplexml_load_string($string);
$xml->registerXPathNamespace("def", "http://www.w3.org/2005/Atom");

$nodes = $xml->xpath("//def:document/def:title");

?>
kdos 30-Jan-2011 10:32
Using stuff like: is_object($xml->module->admin) to check if there actually is a node called "admin", doesn't seem to work as expected, since simplexml always returns an object- in that case an empty one  - even if a particular node does not exist.
For me good old empty() function seems to work just fine in such cases.

Cheers
Max K. 20-Jun-2010 08:38
From the README file:

SimpleXML is meant to be an easy way to access XML data.

SimpleXML objects follow four basic rules:

1) properties denote element iterators
2) numeric indices denote elements
3) non numeric indices denote attributes
4) string conversion allows to access TEXT data

When iterating properties then the extension always iterates over
all nodes with that element name. Thus method children() must be
called to iterate over subnodes. But also doing the following:
foreach ($obj->node_name as $elem) {
  // do something with $elem
}
always results in iteration of 'node_name' elements. So no further
check is needed to distinguish the number of nodes of that type.

When an elements TEXT data is being accessed through a property
then the result does not include the TEXT data of subelements.

Known issues
============

Due to engine problems it is currently not possible to access
a subelement by index 0: $object->property[0].
ie dot raymond at gmail dot com 01-Apr-2010 09:07
If you need to output valid xml in your response, don't forget to set your header content type to xml in addition to echoing out the result of asXML():

<?php

$xml
=simplexml_load_file('...');
...
...
xml stuff
...

//output xml in your response:
header('Content-Type: text/xml');
echo
$xml->asXML();
?>
php at keith tyler dot com 23-Dec-2009 05:57
[Editor's Note: The SimpleXMLIterator class, however, does implement these methods.]

While SimpleXMLElement claims to be iterable, it does not seem to implement the standard Iterator interface functions like ::next and ::reset properly. Therefore while foreach() works, functions like next(), current(), or each() don't seem to work as you would expect -- the pointer never seems to move or keeps getting reset.
bjorn at xQmail dot eu 31-Aug-2009 01:48
If you're not sure the XML will be valid you'd better use:

<?php
$xmlObject
= simplexml_load_string($xml);
// or
$xmlObject = simplexml_load_file(xml);
?>

Both of these return a SimpleXMLElement Object or a libXMLError Object.
radams at circlepix com 24-Apr-2009 04:52
To test whether an element exists:

<?php

    $xml
= <<<EOT
<?xml version='1.0' standalone='yes'?>
<root>
    <test1></test1>
    <test2 />
    <test4> </test4>
</root>
EOT;

   
$xmlDoc = new SimpleXMLElement($xml);

echo
"Test1: \n";
var_dump($xmlDoc->test1);
echo
"\n(" . (bool)$xmlDoc->test1 . ")";
echo
"\n\n";

echo
"Test2: \n";
var_dump($xmlDoc->test2);
echo
"\n(" . (bool)$xmlDoc->test2 . ")";
echo
"\n\n";

echo
"Test3: \n";
var_dump($xmlDoc->test3);
echo
"\n(" . (bool)$xmlDoc->test3 . ")";
echo
"\n\n";

echo
"Test4: \n";
var_dump($xmlDoc->test4);
echo
"\n(" . (bool)$xmlDoc->test4 . ")";
echo
"\n\n";

?>

The var_dumps for test1, test2, and test3 are identical, but the (bool) test gives a '1' for test1 and test2, and a '' for test3.

 
show source | credits | stats | sitemap | contact | advertising | mirror sites