Добавление узла с использованием PHP SimpleXML в XML с пространствами имен - PullRequest
1 голос
/ 08 февраля 2010
<?xml version="1.0" encoding="ISO-8859-2"?>
    <!DOCTYPE pasaz:Envelope SYSTEM "loadOffers.dtd">
    <pasaz:Envelope xmlns:pasaz="http://schemas.xmlsoap.org/soap/envelope/">
        <pasaz:Body>
            <loadOffers xmlns="urn:ExportB2B">
                <offers />
            </loadOffers>
        </pasaz:Body>
    </pasaz:Envelope>

Мне нужно добавить несколько дочерних узлов к узлу «предложения», и я использую SimpleXML.

Код PHP: $offer = $xml->offers->addChild('offer') возвращает ошибку.

Это все неправильно, потому что у меня проблема с обработкой пространств имен в SimpleXML! Пожалуйста, помогите!

1 Ответ

2 голосов
/ 08 февраля 2010

Например, используя xpath, получить целевой / родительский элемент.

<?php
$envelope = new SimpleXMLElement('<?xml version="1.0" encoding="ISO-8859-2"?>
<!DOCTYPE pasaz:Envelope SYSTEM "loadOffers.dtd">
<pasaz:Envelope xmlns:pasaz="http://schemas.xmlsoap.org/soap/envelope/">
  <pasaz:Body>
    <loadOffers xmlns="urn:ExportB2B">
      <offers />
    </loadOffers>
  </pasaz:Body>
</pasaz:Envelope>');

$envelope->registerXPathNamespace('pasaz', 'http://schemas.xmlsoap.org/soap/envelope/');
$envelope->registerXPathNamespace('b2b', 'urn:ExportB2B');
$ns = $envelope->xpath('//pasaz:Body/b2b:loadOffers/b2b:offers');
if ( 0<count($ns) ) {
  $offers = $ns[0];
  $offers->a = 'abc';
  $offers->x = 'xyz';
}
echo $envelope->asXml();

печатает

<?xml version="1.0" encoding="ISO-8859-2"?>
<!DOCTYPE pasaz:Envelope SYSTEM "loadOffers.dtd">
<pasaz:Envelope xmlns:pasaz="http://schemas.xmlsoap.org/soap/envelope/">
  <pasaz:Body>
    <loadOffers xmlns="urn:ExportB2B">
      <offers><a>abc</a><x>xyz</x></offers>
    </loadOffers>
  </pasaz:Body>
</pasaz:Envelope>
...