SimpleXML не может найти элементы пространства имен - PullRequest
1 голос
/ 28 декабря 2010

Я не могу заставить PHP класс SimpleXML распознавать префиксные элементы пространства имен в документе XHTML.Вот мой пример:

test.html

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:zuq="http://localhost/zuq">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
    <h1>Heading</h1>
    <p>Paragraph</p>
    <zuq:region name="myRegion">
        <div class="myClass">
            <h1><zuq:data name="myDataHeading" /></h1>
            <p><zuq:data name="myDataParagraph" /></p>
        </div>
    </zuq:region>
</body>
</html>

Когда я делаю следующее:

$sxml = simplexml_load_file('test.html');
print_r($sxml);

Возвращает:

SimpleXMLElement Object
(
    [head] => SimpleXMLElement Object
        (
            [meta] => SimpleXMLElement Object
                (
                    [@attributes] => Array
                        (
                            [http-equiv] => Content-Type
                            [content] => text/html; charset=utf-8
                        )

                )

            [title] => Untitled Document
        )

    [body] => SimpleXMLElement Object
        (
            [h1] => Heading
            [p] => Paragraph
        )

)

Но когда я делаю следующее:

$sxml = simplexml_load_file('test.html');
$sxml_zuq = $sxml->children('zuq', true);
print_r($sxml_zuq);

Возвращает пустое значение:

SimpleXMLElement Object
(
)

Итерация по объекту с foreach или иным образом не работаети использование URI вместо префикса в children() также дает сбой.

Я, очевидно, где-то допустил ошибку, но я не уверен, где, поскольку моя попытка совершенно идентична многим учебным примерам.наткнулся в моем чтении.

Что здесь происходит?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2010

children() дает только [прямые] дочерние элементы узла контекста, а не потомки.

$html = simplexml_load_file('test.html');

// get <body/>'s children
$html->body->children('zuq', true);

// use XPath to get all zuq:* nodes
$html->xpath('//zuq:*');
0 голосов
/ 08 февраля 2012

Просто для информации, в случае, если определение пространства имен, xmlns: zuq = "http://localhost/zuq" было объявлено в фактическом элементе xml вместо корневого узла, тогда мы должны дополнительно вызвать функцию registerXPathNamespace и затем использовать xpath, как указано в http://www.dimuthu.org/blog/2008/09/30/xpath-in-simplexml/

...