Я новичок в simplexml parser
в PHP. Я запустил примеры, которые нашел, и они работают как рекламируется. Я не могу заставить его работать с моей программой, хотя. Я искал здесь в течение нескольких часов.
У меня есть файл XML с именем core.xml (обратите внимание, что теги узла имеют двоеточия):
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<cp:coreProperties xmlns:cp="http://schemas.openxmlformats.org/package/2006/metadata/core-properties" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dcterms="http://purl.org/dc/terms/" xmlns:dcmitype="http://purl.org/dc/dcmitype/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<dc:title>Lecture 3</dc:title>
<dc:creator>John Brown & Greg Smith</dc:creator>
<cp:lastModifiedBy>Greg Smith</cp:lastModifiedBy>
<cp:revision>165</cp:revision>
<dcterms:created xsi:type="dcterms:W3CDTF">2010-02-19T04:37:55Z</dcterms:created>
<dcterms:modified xsi:type="dcterms:W3CDTF">2014-01-30T02:41:30Z</dcterms:modified>
</cp:coreProperties>
Я использую следующий код, чтобы загрузить его в парсер:
if (file_exists('core.xml')){
echo 'file exists <br>';
$xml_core = simplexml_load_file('core.xml');
print_r($xml_core);
}
else
{
exit('Failed to open core.xml.');
}
Файл существует, но все, что я получаю в print_r:
file exists
SimpleXMLElement Object ( )
Как мне получить доступ к узлам? Другие XML-файлы, которые я должен использовать, имеют многоуровневую глубину.
Спасибо
То, что вы описываете как образец ошибки в вашем вопросе, на самом деле является правильным поведением, а не ошибкой.
Если вы используете print_r
(или же var_dump
в этом отношении) на SimpleXMLElement это покажет вам только некоторая элементарная информация об этом объекте и не все содержимое документа XML.
Чтобы увидеть весь XML, используйте asXML()
метод вместо. В качестве альтернативы для получения отладочной информации вы можете использовать библиотеку, которая специально знает, как отлаживать SimpleXMLElement содержание как simplexml_debug написано IMSop.
В вашем конкретном случае объект отображается пустым (без элементов объекта), поскольку в документе XML нет никаких узлов в пространстве имен по умолчанию (см .: Пространства имен в XML 1.0) что — после более или менее сложные правила SimpleXMLElement к массиву были применены переходы — был бы передан из обработчика внутренней отладки объектов в print_r
или же var_dump
функция будет отображаться затем. Таким образом, дается только имя класса, чтобы вы могли видеть, что это объект определенного класса и не имеет членов:
SimpleXMLElement Object ( )
^ ^ ^
object type | `------ object fields (empty)
|
variable type
Как с этим бороться? Это очень просто: знать XML (вы знаете, что он уже есть) и получать от него данные, как они задокументированы:
Поскольку ваши имена элементов XML содержат двоеточия, вы должны знать, что это так называемые Пространства имен XML. Как вы видели различия в print_r
В результате вы также увидите различия в доступе к дочерним элементам в этом пространстве имен. Вы должны использовать children()
метод и укажите пространство имен, которое вы хотели бы получить дочерние элементы. Если вы используете xpath()
Для доступа к элементам необходимо зарегистрировать префикс пространства имен, прежде чем использовать его в SimpleXMLElement Вы вызываете этот метод на.
Некоторые ассорти выбор SimpleXML и XML, связанных с пространством имен Q&Материал здесь на сайте:
Вы также можете получить эту информацию из руководства по PHP, просто взгляните на информацию, связанную с пространством имен, в SimpleXMLElement API документация.
Ты можешь использовать file_get_contents
загрузить файл XML.
Пытаться
if(file_exists('core.xml'))
{
echo 'file exists <br>';
$xml_core = file_get_contents('core.xml');
$xml = new SimpleXMLElement($xml_core);
print_r($xml);
}
else
{
exit('Failed to open core.xml.');
}