Почему генерируются предупреждающие сообщения о двойных идентификаторах, если их нет? - PullRequest
1 голос
/ 28 июля 2010

Ниже приведено неожиданное предупреждающее сообщение, которое сервер дает мне:

Предупреждение: DOMDocument :: loadHTML () [domdocument.loadhtml]: идентификатор страницы 3 уже определен в объекте, строка: 25 вC: \ Program Files \ Zend \ Apache2 \ htdocs \ joom \ templates \ valueTemplate \ updateRecord.php в строке 74 .

.

Вышеуказанное предупреждающее сообщение генерируется при выполненииследующий код:

$html = new DOMDocument();
$html->loadHTML( $fetchedData[ 'content' ] );

.

Сообщение является неожиданным, поскольку в HTML-документе нет повторного использования «page3» в качестве идентификатора.'page3', однако, многократно используется в документе HTML как значение атрибута name.Например:

<li id="index00025" name="page3" class="fooBar"></li>

.

Любая помощь по этому вопросу будет искренне признательна.Заранее спасибо.

Ответы [ 2 ]

2 голосов
/ 28 июля 2010

Артефакт правильно. Другой способ взглянуть на это - как это делает спецификация HTML - это то, что атрибуты name и id используют одно и то же пространство имен. Таким образом, идентификатор, определенный в одном из этих атрибутов, отображается в коллекции значений для другого, т. Е. Если вы определите name="foo", foo будет отображаться при перечислении всех атрибутов name или всех id атрибутов.

Источник: http://www.w3.org/TR/html401/struct/links.html#h-12.2.3

2 голосов
/ 28 июля 2010

Это ожидаемое поведение. В HTML атрибут «name» вводит идентификатор, так же как и сам атрибут «id», в случае, если элемент a (я ничего не знаю о внутренностях libxml, поэтому не знаю, при каких обстоятельствах elem может быть NULL).

/**
 * xmlIsID:
 * [...]
 *
 * Determine whether an attribute is of type ID. In case we have DTD(s)
 * then this is done if DTD loading has been requested. In the case
 * of HTML documents parsed with the HTML parser, then ID detection is
 * done systematically.
 * [...]
 */
int
xmlIsID(xmlDocPtr doc, xmlNodePtr elem, xmlAttrPtr attr) {
    [...]
    } else if (doc->type == XML_HTML_DOCUMENT_NODE) {
        if ((xmlStrEqual(BAD_CAST "id", attr->name)) ||
        ((xmlStrEqual(BAD_CAST "name", attr->name)) &&
        ((elem == NULL) || (xmlStrEqual(elem->name, BAD_CAST "a")))))
        return(1);
    return(0);    
    }
    [...]
}

Источник: valid.c в дистрибутиве libxml.

...