Ricerca…


Creare un file XML usando XMLWriter

Creare un'istanza di un oggetto XMLWriter:

$xml = new XMLWriter();

Quindi aprire il file a cui si desidera scrivere. Ad esempio, per scrivere su /var/www/example.com/xml/output.xml , utilizzare:

$xml->openUri('file:///var/www/example.com/xml/output.xml');

Per avviare il documento (creare il tag aperto XML):

$xml->startDocument('1.0', 'utf-8');

Questo produrrà:

<?xml version="1.0" encoding="UTF-8"?>

Ora puoi iniziare a scrivere elementi:

$xml->writeElement('foo', 'bar');

Questo genererà l'XML:

<foo>bar</foo>

Se hai bisogno di qualcosa di un po 'più complesso dei semplici nodi con valori semplici, puoi anche "avviare" un elemento e aggiungere attributi ad esso prima di chiuderlo:

$xml->startElement('foo');
$xml->writeAttribute('bar', 'baz');
$xml->writeCdata('Lorem ipsum');
$xml->endElement();

Questo produrrà:

<foo bar="baz"><![CDATA[Lorem ipsum]]></foo>

Leggi un documento XML con DOMDocument

Analogamente al SimpleXML, è possibile utilizzare DOMDocument per analizzare XML da una stringa o da un file XML

1. Da una stringa

$doc = new DOMDocument();
$doc->loadXML($string);

2. Da un file

$doc = new DOMDocument();
$doc->load('books.xml');// use the actual file path. Absolute or relative

Esempio di analisi

Considerando il seguente XML:

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <name>PHP - An Introduction</name>
      <price>$5.95</price>
      <id>1</id>
   </book>
   <book>
      <name>PHP - Advanced</name>
      <price>$25.00</price>
      <id>2</id>
   </book>
</books>

Questo è un codice di esempio per analizzarlo

$books = $doc->getElementsByTagName('book');
foreach ($books as $book) {
    $title = $book->getElementsByTagName('name')->item(0)->nodeValue;
    $price = $book->getElementsByTagName('price')->item(0)->nodeValue;
    $id = $book->getElementsByTagName('id')->item(0)->nodeValue;
    print_r ("The title of the book $id is $title and it costs $price." . "\n");
}

Questo produrrà:

Il titolo del libro 1 è PHP - Un'introduzione e costa $ 5,95.

Il titolo del libro 2 è PHP - Avanzato e costa $ 25,00.

Creare un XML usando DomDocument

Per creare un XML usando DOMDocument, in pratica, dobbiamo creare tutti i tag e gli attributi usando i createElement() e createAttribute() e loro creano la struttura XML con appendChild() .

L'esempio seguente include tag, attributi, una sezione CDATA e uno spazio dei nomi diverso per il secondo tag:

$dom = new DOMDocument('1.0', 'utf-8');
$dom->preserveWhiteSpace = false;
$dom->formatOutput = true;

//create the main tags, without values
$books = $dom->createElement('books');
$book_1 = $dom->createElement('book');

// create some tags with values
$name_1 = $dom->createElement('name', 'PHP - An Introduction');
$price_1 = $dom->createElement('price', '$5.95');
$id_1 = $dom->createElement('id', '1');

//create  and append an attribute
$attr_1 = $dom->createAttribute('version');
$attr_1->value = '1.0';
//append the attribute
$id_1->appendChild($attr_1);

//create the second tag book with different namespace
$namespace = 'www.example.com/libraryns/1.0';

//include the namespace prefix in the books tag
$books->setAttributeNS('http://www.w3.org/2000/xmlns/', 'xmlns:ns', $namespace);
$book_2 = $dom->createElementNS($namespace,'ns:book');
$name_2 = $dom->createElementNS($namespace, 'ns:name');

//create a CDATA section (that is another DOMNode instance) and put it inside the name tag
$name_cdata = $dom->createCDATASection('PHP - Advanced');
$name_2->appendChild($name_cdata);
$price_2 = $dom->createElementNS($namespace, 'ns:price', '$25.00');
$id_2 = $dom->createElementNS($namespace, 'ns:id', '2');

//create the XML structure
$books->appendChild($book_1);
$book_1->appendChild($name_1);
$book_1->appendChild($price_1);
$book_1->appendChild($id_1);
$books->appendChild($book_2);
$book_2->appendChild($name_2);
$book_2->appendChild($price_2);
$book_2->appendChild($id_2);

$dom->appendChild($books);

//saveXML() method returns the XML in a String
print_r ($dom->saveXML());

Questo produrrà il seguente XML:

<?xml version="1.0" encoding="utf-8"?>
<books xmlns:ns="www.example.com/libraryns/1.0">
  <book>
    <name>PHP - An Introduction</name>
    <price>$5.95</price>
    <id version="1.0">1</id>
  </book>
  <ns:book>
    <ns:name><![CDATA[PHP - Advanced]]></ns:name>
    <ns:price>$25.00</ns:price>
    <ns:id>2</ns:id>
  </ns:book>
</books>

Leggi un documento XML con SimpleXML

È possibile analizzare XML da una stringa o da un file XML

1. Da una stringa

$xml_obj = simplexml_load_string($string);

2. Da un file

$xml_obj = simplexml_load_file('books.xml');

Esempio di analisi

Considerando il seguente XML:

<?xml version="1.0" encoding="UTF-8"?>
<books>
   <book>
      <name>PHP - An Introduction</name>
      <price>$5.95</price>
      <id>1</id>
   </book>
   <book>
      <name>PHP - Advanced</name>
      <price>$25.00</price>
      <id>2</id>
   </book>
</books>

Questo è un codice di esempio per analizzarlo

$xml = simplexml_load_string($xml_string);
$books = $xml->book;
foreach ($books as $book) {
    $id = $book->id;
    $title = $book->name;
    $price = $book->price;
    print_r ("The title of the book $id is $title and it costs $price." . "\n");
}

Questo produrrà:

Il titolo del libro 1 è PHP - Un'introduzione e costa $ 5,95.
Il titolo del libro 2 è PHP - Avanzato e costa $ 25,00.

Utilizzo di XML con la libreria SimpleXML di PHP

SimpleXML è una potente libreria che converte stringhe XML in un oggetto PHP facile da usare.

Quanto segue presuppone una struttura XML come sotto.

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</document>

Leggi i nostri dati in SimpleXML

Per iniziare, dobbiamo leggere i nostri dati in SimpleXML. Possiamo farlo in 3 modi diversi. In primo luogo, possiamo caricare i nostri dati da un nodo DOM.

$xmlElement = simplexml_import_dom($domNode);

La nostra prossima opzione è caricare i nostri dati da un file XML.

$xmlElement = simplexml_load_file($filename);

Infine, possiamo caricare i nostri dati da una variabile.

$xmlString = '<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</document>';
$xmlElement = simplexml_load_string($xmlString);

Che tu abbia scelto di caricare da un elemento DOM , da un file o da una stringa , ora ti rimane una variabile SimpleXMLElement chiamata $xmlElement . Ora possiamo iniziare a utilizzare il nostro XML in PHP.

Accesso ai nostri dati SimpleXML

Il modo più semplice per accedere ai dati nel nostro oggetto SimpleXMLElement è chiamare direttamente le proprietà . Se vogliamo accedere al nostro primo bookName, StackOverflow SimpleXML Example , possiamo accedervi come di seguito.

echo $xmlElement->book->bookName;

A questo punto, SimpleXML assumerà che, poiché non abbiamo detto esplicitamente quale libro vogliamo, vogliamo il primo. Tuttavia, se decidiamo che non vogliamo il primo, piuttosto che vogliamo un Another SimpleXML Example , possiamo accedervi come di seguito.

echo $xmlElement->book[1]->bookName;

Vale la pena notare che l'utilizzo di [0] funziona come non usarlo, quindi

$xmlElement->book

funziona allo stesso modo di

$xmlElement->book[0]

Looping attraverso il nostro XML

Esistono molte ragioni per cui desideri eseguire il ciclo di codice XML , ad esempio che hai un numero di elementi, libri nel nostro caso, che vorremmo visualizzare su una pagina web. Per questo, possiamo usare un ciclo foreach o un ciclo for standard, sfruttando la funzione di conteggio di SimpleXMLElement. .

foreach ( $xmlElement->book as $thisBook ) {
    echo $thisBook->bookName
}

o

$count = $xmlElement->count();
for ( $i=0; $i<$count; $i++ ) {
    echo $xmlElement->book[$i]->bookName;
}

Gestione degli errori

Ora siamo arrivati ​​così lontano, è importante rendersi conto che siamo solo umani, e probabilmente incontreremo un errore alla fine - specialmente se stiamo giocando con file XML diversi tutto il tempo. E così, vorremmo gestire quegli errori.

Considera che abbiamo creato un file XML. Noterai che mentre questo XML è molto simile a quello che avevamo prima, il problema con questo file XML è che il tag finale finale è / doc invece che / document.

<?xml version="1.0" encoding="UTF-8"?>
<document>
    <book>
        <bookName>StackOverflow SimpleXML Example</bookName>
        <bookAuthor>PHP Programmer</bookAuthor>
    </book>
    <book>
        <bookName>Another SimpleXML Example</bookName>
        <bookAuthor>Stack Overflow Community</bookAuthor>
        <bookAuthor>PHP Programmer</bookAuthor>
        <bookAuthor>FooBar</bookAuthor>
    </book>
</doc>

Ora, diciamo, lo carichiamo nel nostro PHP come $ file.

libxml_use_internal_errors(true);
$xmlElement = simplexml_load_file($file);
if ( $xmlElement === false ) {
    $errors = libxml_get_errors();
    foreach ( $errors as $thisError ) {
        switch ( $thisError->level ) {
            case LIBXML_ERR_FATAL:
                echo "FATAL ERROR: ";
                break;
            case LIBXML_ERR_ERROR:
                echo "Non Fatal Error: ";
                break;
            case LIBXML_ERR_WARNING:
                echo "Warning: ";
                break;
        }
        echo $thisError->code . PHP_EOL .
            'Message: ' . $thisError->message . PHP_EOL .
            'Line: ' . $thisError->line . PHP_EOL .
            'Column: ' . $thisError->column . PHP_EOL .
            'File: ' . $thisError->file;
    }
    libxml_clear_errors();
} else {
    echo 'Happy Days';
}

Saremo accolti con il seguente

FATAL ERROR: 76
Message: Opening and ending tag mismatch: document line 2 and doc

Line: 13
Column: 10
File: filepath/filename.xml

Tuttavia, non appena risolviamo questo problema, ci viene presentato "Happy Days".



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow