Метод SimpleXMLElement::__construct()
и связанные функции simplexml_load_string()
и simplexml_load_file()
имеют необязательную пару параметров, связанных с XML Namepspaces: $ns
и $is_prefix
.
Несмотря на то, что я вижу, что они связаны с пространствами имен XML, я задаюсь вопросом, для чего они предназначены и как они работают.
Согласно руководству PHP, эти два параметра были добавлены в PHP версии 5.2. В официальном обновлении PHP 5 эти изменения явно не отмечены, но в readme для обновления PHP 5.2 есть такие .
Затем, изучая источник 5.2 для конструктора ( в lxr ), он показывает, что это связано с итератором:
sxe->iter.nsprefix = ns_len ? xmlStrdup((xmlChar *)ns) : NULL; sxe->iter.isprefix = isprefix;
Поэтому я предполагаю, что эти два определяют пространство имен XML, которое SimpleXMLElement
будет по умолчанию SimpleXMLElement
. Небольшой тест может подтвердить это:
$xml = new SimpleXMLElement( '<root><a/><b/><c/></root>' ); var_dump(count(iterator_to_array($xml))); #int(3)
По умолчанию итератор имеет три элемента: a, b и c. Теперь установка параметров, указывающих, что итерация будет находиться в другом пространстве XML-имен, чем значение по умолчанию, изменит это:
$xml = new SimpleXMLElement( '<root><a/><b/><c/></root>', 0, FALSE, "ns:1" ); var_dump(count(iterator_to_array($xml))); #int(0)
Итерация теперь имеет нулевые элементы, потому что корневой элемент не имеет дочерних элементов в пространстве имен URI ns:1
.
Изменение пространства имен корневого элемента на ns:1
снова откроет три элемента, потому что теперь эти три дочерних элемента находятся в этом пространстве имен, они наследуют его от родителя:
$xml = new SimpleXMLElement( '<root xmlns="ns:1"><a/><b/><c/></root>', 0, FALSE, "ns:1" ); var_dump(count(iterator_to_array($xml))); #int(3)
Точно так же, как если бы сами дети находились в пространстве имен, заданных этой парой параметров, и через префикс для этих элементов:
$xml = new SimpleXMLElement( '<root xmlns:n="ns:1"><n:a/><n:b/><n:c/></root>', 0, FALSE, "ns:1" ); var_dump(count(iterator_to_array($xml))); #int(3)