Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Другой подход заключается в использовании SimpleXML
для синтаксического анализа и DOMDocument
для манипуляции / доступа, который вообще обходит проблемы с именами:
$xml = new SimpleXMLElement($r);
$xml = dom_import_simplexml($xml);
$nodelist= $xml->getElementsByTagName('event');
for($i = 0; $i < $nodelist->length; $i++) {
$sessions = $nodelist->item($i)->getElementsByTagName('sessionKey');
echo $sessions->item(0)->nodeValue;
}
он работает без registerXPathNamespace
и полного префикса пространства имен в запросах xpath:
$xml = new SimpleXMLElement($r);
foreach($xml->xpath('//event:event') as $event) {
var_export($event->xpath('event:sessionKey'));
}
Много работая с simplexml, вот как я это делаю.
Волшебный трюк, если у вас уже есть элемент и просто хочу, чтобы его разные дети с именами, скажем, для такой структуры:
<entry>
<title type="text">My test entry</title>
<gd:when startTime="2017-02-26T02:00:00Z" endTime="2017-02-26T03:00:00Z"/>
<gc:notes type="string">A type</gc:notes>
</entry>
Является отправкой true в качестве второго параметра для функции children:
$title = (string) $entry->title;
$gd = $entry->children('gd', TRUE);
$attrs = $gd->when->attributes();
$startTime = (string) $attrs->startTime;
$gc = $entry->children('gc', TRUE);
$notes = (string) $gc->notes();
здесь альтернатива, которая сработала для меня.
$xml = simplexml_load_string($r);
$ns = $xml->getNamespaces(true);
foreach ($xml->children($ns['event'])->event as $skey) {
$sessionKey = $skey->children($ns['event'])->sessionKey;
echo $sessionKey;
}
children()
, по крайней мере, с его первым параметром. Если вы знаете структуру документа перед началом работы, вы можете даже ввести имя пространства имен (или его URI) вручную в качестве альтернативы getNamespaces()
.
– Álvaro González
11 February 2014 в 18:23
Я могу ошибаться, но я не думаю, что XML с символом двоеточия, подобным SOAP, можно правильно проанализировать с помощью SimpleXMLElement
.
Я уверен, что есть более элегантный способ сделать это, но я обычно читайте содержимое файла в переменной, используя file_get_contents()
, затем замените / удалите двоеточия, затем отправьте его на SimpleXMLElement
.
Вы должны зарегистрировать пространство имен для каждого объекта simpleXMLElement, который вы используете.
$xml = new SimpleXMLElement($r);
$xml->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
foreach($xml->xpath('//e:event') as $event) {
$event->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
var_export($event->xpath('//e:sessionKey'));
}
Пространство имен также должно быть объявлено где-то в файле xml.
<event:event xmlns:event="http://www.webex.com/schemas/2002/06/service/event">
...
Метод Топор также описан. Вы можете пропустить registerXPathNamespace, если знаете, что xml-файл всегда будет использовать тот же префикс.
Использование registerXPathNamespace
, а затем вызов xpath
на самом деле не работал для меня. Мне пришлось пойти с решением, представленным в этом замечательном сообщении: http://blog.preinheimer.com/index.php?/archives/172-SimpleXML,-Namespaces-Hair-loss.html
Итак, в вашем случае это:
echo $xml->children('http://www.webex.com/schemas/2002/06/service/event')->sessionName;
Будет выводиться:
Узнать QB в минутах