Sök…


Skapa en XML-fil med XMLWriter

Instantiera ett XMLWriter-objekt:

$xml = new XMLWriter();

Öppna sedan filen du vill skriva till. För att till exempel skriva till /var/www/example.com/xml/output.xml , använd:

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

Så här startar du dokumentet (skapa den öppna XML-taggen):

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

Detta kommer att matas ut:

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

Nu kan du börja skriva element:

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

Detta kommer att generera XML:

<foo>bar</foo>

Om du behöver något lite mer komplicerat än bara noder med vanliga värden kan du också "starta" ett element och lägga till attribut innan du stänger det:

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

Detta kommer att matas ut:

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

Läs ett XML-dokument med DOMDocument

På samma sätt som SimpleXML kan du använda DOMDocument för att analysera XML från en sträng eller från en XML-fil

1. Från en sträng

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

2. Från en fil

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

Exempel på parsing

Med tanke på följande 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>

Detta är ett exempelkod för att analysera det

$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");
}

Detta kommer att matas ut:

Bokens titel 1 är PHP - En introduktion och den kostar 5,95 dollar.

Titeln på boken 2 är PHP - Advanced och den kostar $ 25,00.

Skapa en XML med DomDocument

För att skapa en XML med DOMDocument måste vi i princip skapa alla taggar och attribut med createElement() och createAttribute() och de skapar XML-strukturen med appendChild() .

Exemplet nedan innehåller taggar, attribut, ett CDATA-avsnitt och ett annat namnutrymme för den andra taggen:

$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());

Detta kommer att producera följande 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>

Läs ett XML-dokument med SimpleXML

Du kan analysera XML från en sträng eller från en XML-fil

1. Från en sträng

$xml_obj = simplexml_load_string($string);

2. Från en fil

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

Exempel på parsing

Med tanke på följande 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>

Detta är ett exempelkod för att analysera det

$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");
}

Detta kommer att matas ut:

Bokens titel 1 är PHP - En introduktion och den kostar 5,95 dollar.
Titeln på boken 2 är PHP - Advanced och den kostar $ 25,00.

Utnyttja XML med PHP: s SimpleXML-bibliotek

SimpleXML är ett kraftfullt bibliotek som konverterar XML-strängar till ett lättanvänt PHP-objekt.

Följande antar en XML-struktur enligt nedan.

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

Läs våra data i SimpleXML

För att komma igång måste vi läsa våra data i SimpleXML. Vi kan göra detta på tre olika sätt. För det första kan vi ladda våra data från en DOM-nod.

$xmlElement = simplexml_import_dom($domNode);

Vårt nästa alternativ är att ladda våra data från en XML-fil.

$xmlElement = simplexml_load_file($filename);

Slutligen kan vi ladda våra data från en variabel.

$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);

Oavsett om du har valt att ladda från ett DOM-element , från en fil eller från en sträng sitter du nu kvar med en SimpleXMLElement-variabel som heter $xmlElement . Nu kan vi börja använda vår XML i PHP.

Åtkomst till våra SimpleXML-data

Det enklaste sättet att få tillgång till data i vårt SimpleXMLElement-objekt är att ringa egenskaperna direkt . Om vi vill komma åt vårt första boknamn, StackOverflow SimpleXML Example , kan vi få tillgång till det enligt nedan.

echo $xmlElement->book->bookName;

Vid denna punkt kommer SimpleXML att anta att eftersom vi inte har sagt det uttryckligen vilken bok vi vill ha, att vi vill ha den första. Men om vi bestämmer oss för att vi inte vill ha den första, snarare att vi vill ha ett Another SimpleXML Example , kan vi få åtkomst till det enligt nedan.

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

Det är värt att notera att att använda [0] fungerar på samma sätt som att inte använda det, så

$xmlElement->book

fungerar på samma sätt som

$xmlElement->book[0]

Looping genom vår XML

Det finns många anledningar till att du kanske vill gå igenom XML , till exempel att du har ett antal artiklar, böcker i vårt fall, som vi vill visa på en webbsida. För detta kan vi använda en förhandslinga eller en standard för slinga , och dra fördel av SimpleXMLElements räknefunktion. .

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

eller

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

Hantera fel

Nu har vi kommit så långt, det är viktigt att inse att vi bara är människor och kommer troligen att möta ett fel så småningom - särskilt om vi spelar med olika XML-filer hela tiden. Och så kommer vi att hantera dessa fel.

Tänk på att vi skapade en XML-fil. Du kommer att märka att även om denna XML är mycket lika vad vi hade tidigare, är problemet med denna XML-fil att den slutliga stängningstaggen är / doc istället för / dokument.

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

Nu säger vi att vi laddar detta i vår PHP som $ -fil.

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

Vi kommer att hälsas med följande

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

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

Men så fort vi löser problemet får vi "Happy Days".



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow