Каковы параметры «$ ns» и «$ is_prefix»?

Метод 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)