SimpleXMLElement::__construct()
method和相關功能simplexml_load_string()
和simplexml_load_file()
都有一個可選的與XML命名空間相關的參數對:$ns
和$is_prefix
。
儘管我可以看到那些與XML命名空間有關,但我不知道它們是什麼以及它們是如何工作的。
SimpleXMLElement::__construct()
method和相關功能simplexml_load_string()
和simplexml_load_file()
都有一個可選的與XML命名空間相關的參數對:$ns
和$is_prefix
。
儘管我可以看到那些與XML命名空間有關,但我不知道它們是什麼以及它們是如何工作的。
根據PHP手冊,這兩個參數已被添加到PHP 5.2版中。官方的PHP 5更新日誌沒有明確指出這些更改,但是the PHP 5.2 update readme has these。
然後尋找到了5.2源構造(in lxr)這表明,這是關係到迭代器:
sxe->iter.nsprefix = ns_len ? xmlStrdup((xmlChar *)ns) : NULL; sxe->iter.isprefix = isprefix;
所以我假定這兩個指定XML命名空間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)
如果您在php.net註釋中放入此答案,您會做得很好。因爲沒有辦法知道它。他們沒有寫任何......真的。 –