Что такое код domdocument >doctype


Содержание

Сценарии объектной модели документа DOM XML средствами OLE-Automation

MS XML Parser как OLE-сервер

Библиотека MS XML Parser предоставляет возможность работы с XML-документами в скриптах, использующих объектную модель DOM XML. Такая работа возможна практически в любых средах, способных выступить в роли OLE-клиента. В данной статье примеры скриптов будут приводиться на языке VBScript для административных скриптов Windows. Вы можете копировать содержимое подобных примеров в текстовые файлы с расширением .vbs и запускать эти файлы на исполнение двойным щелчком мыши или из командной строки с помощью интерпретатора cscript.exe.

Объект DOMDocument создаётся следующим образом:

Set xmlParser = CreateObject(«Msxml2.DOMDocument»)

После этого вы можете вызывать и использовать методы и свойства этого объекта для чтения и записи XML-документов. Примечание: методы объектов XMLDOMDocument и XMLDOMElement во многом сходны, поэтому рассматриваются в данной статье совместно. Описание свойств, методов и событий в данной статье не является полностью исчерпывающим. Полное описание объектной модели MS XML Parser вы можете получить в MSDN, воспользовавшись, например, поиском по словосочетанию «IXMLDOMDocument/DOMDocument Members» или «IXMLDOMElement Members».

Пример XML-документа

В примерах кода, приведённых ниже, используется следующий «образцовый» XML-документ, представляющий из себя некий абстрактный упрощённый каталог товаров:

Вот XSL-таблица стилей для вышеприведённого документа, которая также является обычным XML-документом:

Загрузка XML-документа, отслеживание ошибок

Перечень свойств, методов и событий:

Описание
asyncБулево. Чтение и запись. Истина, если разрешена асинхронная загрузка документа. По умолчанию — истина. Если свойство установлено в True, метод load вернёт управление раньше, чем загрузка будет завершена. В этом случае вы можете использовать свойство readyState для проверки состояния загрузки, обрабатывая событие onreadystatechange.
parsedБулево. Только для чтения. Определяет состояние разборки узла и его дочерних узлов. В процессе асинхронного доступа в какой-то конкретный момент может оказаться доступным не все дерево документа. Перед выполнением некоторых операций, типа преобразований XSLT, полезно знать, доступно ли все дерево ниже этого узла для обработки.
parseErrorТолько для чтения. Возвращает ссылку на объект XMLDOMParseError, при помощи которого можно получить подробную информацию о последней ошибке анализатора.
readyStateТолько для чтения. Возвращает целое число, характеризующее текущее состояние анализатора:

  • LOADING (1) — находится в процессе загрузки документа.
  • LOADED (2) — загрузка завершена, но объектная модель документа ещё не доступна.
  • INTERACTIVE (3) — объектная модель создана (все элементы разобраны, установлены их связи и атрибуты), но доступна пока только для чтения.
  • COMPLETED (4) — документ разобран, с ошибками или без.

resolveExternalsБулево. Чтение и запись. По умолчанию — истина. Определяет, должны ли быть разрешены во время разбора внешние определения — пространства имён, внешние подмножества DTD и ссылки на внешние примитивы, независимо от проверки на валидность. Если задано True, внешние определения разрешаются во время разбора. Это позволяет определить атрибуты по умолчанию и типы данных и использовать внешнее подмножество DTD. Эта установка независима от того, должна ли быть выполнена проверка на валидность (что задаётся значением свойства validateOnParse). Если внешнее определение не может быть разрешено в процессе разбора, происходит ошибка.
validateOnParseБулево. Чтение и запись. По умолчанию — истина. Определяет, должен ли парсер проверить документ на валидность. Если установлено False, осуществляется только проверка на корректно сформированный (well-formed) документ.
abort()Прерывание процесса асинхронной загрузки и обработки документа. Объект XMLDOMParseError будет содержать информацию об ошибке. Если загрузка уже завершена (свойство readyState равно 4), никакие действия не предпринимаются.
load(xmlSource)Загружает документ, URL которого задан параметром xmlSource. В случае успеха возвращает True. Вызов этого метода обнуляет содержимое текущего документа. Если указанный URL не доступен или не ссылается на документ XML, этот метод возвращает ошибку и устанавливает свойство documentElement в null. Вы можете использовать этот метод, чтобы проверить, правильно ли построен (well-formed) документ XML. Вы не можете использовать этот метод, чтобы проверить документ на валидность.
loadXML(strXML)Загружает XML-фрагмент из передаваемой строки. Вы можете использовать этот метод, чтобы проверить, правильно ли построен (well-formed) документ XML. Вы не можете использовать этот метод, чтобы проверить документ на валидность.
ondataavailableСобытие вызывается, когда обработчик обрабатывает очередную порцию данных документа. В обработчике этого события можно проверять текущий статус асинхронной загрузки (значение свойства readyState).
onreadystatechangeСобытие вызывается каждый раз, когда изменяется состояние обработчика — значение свойства readyState.

Свойства объекта XMLDOMParseError (все свойства доступны только для чтения):

Описание
errorCode Содержит код возникшей ошибки или нуль, если ошибки не случилось.
filepos Содержит смещение относительно начала файла, в котором обнаружена ошибка.
line Содержит номер строки, в которой обнаружена ошибка.
linepos Содержит позицию ошибки в строке, в которой обнаружена ошибка.
reason Содержит описание ошибки.
srcText Содержит полный текст строки, в которой обнаружена ошибка.
url Содержит URL обрабатываемого документа.

Пример скрипта, осуществляющего загрузку XML-документа с проверкой на ошибки:

Пример асинхронной загрузки XML-документа:

Обход дерева элементов

Перечень свойств и методов:

Описание
documentElement Содержит узел, представляющий корневой элемент документа (объект XMLDOMElement). Чтение и запись. Возможно присвоение ссылки на другой объект созданного ранее документа.
childNodes Содержит коллекцию (объект XMLDOMNodeList) всех дочерних узлов-неатрибутов данного узла. Только чтение.
firstChild Содержит первый дочерний узел данного узла, не являющийся атрибутом. Только чтение.
lastChild Содержит последний дочерний узел данного узла, не являющийся атрибутом. Только чтение.
nextSibling Содержит следующий узел (любого типа) на том же уровне данного узла. Только чтение.
previousSibling Содержит предыдущий узел (любого типа) на том же уровне данного узла. Только чтение.
parentNode Содержит узел, для которого данный узел является дочерним (не действует для атрибутов). Только чтение.
ownerDocument Содержит корневой узел документа, содержащего данный узел. Только чтение.
text Содержит всё текстовое содержимое данного узла, включая подчинённые узлы. Чтение и запись.
xml Содержит всё xml-содержимое данного узла, включая подчинённые узлы. Только чтение.
nodeValue Содержит значение данного узла. Если компонент XML непосредственно не имеет значения, содержит null. Чтение и запись.
getElementsByTagName(typename) Возвращает коллекцию XMLDOMNodeList всех элементов заданного типа. Если указано «*», возвращает все элементы.
attributes Содержит коллекцию XMLDOMNamedNodeMap всех дочерних узлов-атрибутов данного узла. Только чтение.
getAttribute(name) Возвращает значение атрибута с заданным именем.
getAttributeNode(name) Возвращает узел атрибута с заданным именем.

Свойства и методы объекта-коллекции XMLDOMNodeList:

Описание
length Количество элементов (узлов) в коллекции.
item(index) Возвращает узел по заданному индексу. Отсчёт начинается с нуля. Данный метод является методом по умолчанию.
reset() Устанавливает внутренний указатель на позицию перед первым узлом в наборе, чтобы следующий вызов nextNode() возвращал первый узел.
nextNode() Возвращает следующий узел в наборе, в соответствии с позицией внутреннего указателя.

Коллекция XMLDOMNamedNodeMap помимо свойств и методов коллекции XMLDOMNodeList поддерживает методы:

Описание
getNamedItem(strName) Возвращает узел, соответствующий атрибуту с заданным именем.
setNamedItem(newItem) Добавляет переданный узел-атрибут в коллекцию (если атрибут с таким именем уже есть, замещает).

Перебор наименований товаров из образцового XML-документа:

Ещё один способ перебора наименований товаров из образцового XML-документа (используем коллекцию XMLDOMNodeList):

Работаем с атрибутами. Выводим наименования только импортных товаров из образцового XML-документа:

Рекурсивный обход всего дерева элементов. Этот скрипт будет работать для любого XML-документа, в т.ч. для XSL-таблицы стилей, приведённой выше непосредственно после нашего «каталога товаров»:

Получение информации о текущем узле дерева XML-документа

Описание
nodeNameСодержит полное имя данного узла, включая префикс пространства имён. Только чтение.
baseNameСодержит имя данного узла без префикса пространства имён. Только чтение.
prefixСодержит префикс (пространства имён) имени данного узла. Только чтение.
nodeTypeСодержит тип текущего узла (число). Только чтение. Возможные значения:

  • NODE_ELEMENT(1) — элемент.
  • NODE_ATTRIBUTE(2) — атрибут.
  • NODE_TEXT(3) — текст.
  • NODE_CDATA_SECTION(4) — раздел CDATA.
  • NODE_ENTITY_REFERENCE(5) — примитив (ссылка в тексте).
  • NODE_ENTITY(6) — объявление примитива.
  • NODE_PROCESSING_INSTRUCTION(7) — инструкция по обработке.
  • NODE_COMMENT(8) — комментарий.
  • NODE_DOCUMENT(9) — корневой элемент документа.
  • NODE_DOCUMENT_TYPE(10) — описание типа документа (DTD).
  • NODE_DOCUMENT_FRAGMENT(11) — фрагмент XML-документа (несвязанное поддерево).
  • NODE_NOTATION(12) — нотация.

nodeTypeStringСодержит тип текущего узла (строка строчными буквами). Только чтение.
dataTypeСодержит тип данных узла-атрибута, если этот тип данных определён в DTD. Чтение и запись.
namespaceURIСодержит URI пространства имён текущего узла. Только чтение.
definitionДля узла типа «entityreference» содержит узел типа «entity» (т.е. его DTD-определение). Только чтение.

Рекурсивный обход всего дерева элементов с выводом информации о текущем узле. Этот скрипт будет работать для любого XML-документа, в т.ч. для XSL-таблицы стилей, приведённой выше непосредственно после нашего «каталога товаров»:


Поиск и отбор узлов

Описание
selectNodes(patternString) Возвращает коллекцию XMLDOMNodeList, содержащую поддерево, выбранное по шаблону поиска patternString.
selectSingleNode(patternString) Аналогичен методу selectNodes, но возвращает только первый узел из выбранного поддерева.

В качестве параметра вышеуказанные методы принимают строку XSL-запроса (образец поиска — XSL pattern). Язык XSL-запросов напоминает способ определения пути в файловой системе — это список узлов, разделённых символом «/». Для указания на текущий элемент используется символ «.», на родительский — «..», для указания на все дочерние элементы — символ «*», для указания на элемент, расположенный ниже по дереву (не важно, на каком уровне вложенности) — символы «//». Условия в запросе заключаются в квадратные скобки «[» и «]». Имена атрибутов в запросе должны предваряться символом «@».

Вот примеры простейших запросов к образцовому XML-документу, расположенному в начале статьи:

  • «/PRODUCTS» — корневой элемент.
  • «//PRODUCT» или «/PRODUCTS/PRODUCT» — все элементы PRODUCT.
  • «//PRODUCT[@import]» — все элементы PRODUCT, в которых определён атрибут import.
  • «//PRODUCT[@import=’yes’]» — все элементы PRODUCT, у которых атрибут import равен «yes».
  • «//PRODUCT[SORT]» — все элементы PRODUCT, которые содержат хотя бы один элемент SORT.
  • «//SORT[COLOR or PRICE]» — все элементы SORT, которые содержат элементы COLOR или PRICE.

Выберем из образцового XML-документа и отобразим наименования отечественных товаров, у которых есть сорт серого цвета, а также всех импортных товаров:

Вот запрос, составленный по-другому, но возвращающий те же результаты:

Ещё один способ выборки, с использованием метода selectSingleNode:

Создание, модификация и запись XML-документов

Описание
save(objTarget) Сохраняет документ в файле (если указан URL) или замещает содержимое другого документа (если указан объект XMLDOMDocument).
createElement(tagName) Создаёт и возвращает элемент с указанным именем.
createAttribute(name) Создаёт и возвращает новый атрибут с указанным именем.
createCDATASection(strData) Создаёт и возвращает новый узел CDATA, содержащий переданное значение.
createProcessingInstruction(strTarget, strData) Создаёт и возвращает новый узел инструкции по обработке.
createComment(strComment) Создаёт и возвращает новый узел комментария.
createEntityReference(strName) Создаёт и возвращает новый узел ссылки на примитив.
createTextNode(strText) Создаёт и возвращает новый текстовый узел.
createNode(numType, strName, strNamespaceURI) Универсальный метод — создаёт и возвращает новый узел указанного типа и названия. Позволяет использовать пространства имён.
createDocumentFragment() Создаёт и возвращает новый пустой фрагмент XML-документа, который в дальнейшем можно «наполнить» узлами и присоединить к XML-документу.
cloneNode(boolDeep) Создаёт и возвращает копию текущего узла. Параметр boolDeep определяет, нужно ли рекурсивно копировать дочерние элементы.
setAttribute(name, value) Устанавливает значение указанного атрибута текущего узла. При необходимости создаёт атрибут.
setAttributeNode(AttributeNode) Устанавливает или обновляет переданный атрибут у текущего элемента.
removeAttribute(name) Удаляет указанный атрибут. Если указанный атрибут имеет значение по умолчанию, вместо удаления происходит замещение: атрибуту просто устанавливается значение по умолчанию.
removeAttributeNode(nodeAttribute) Удаляет переданный объект узла-атрибута. Если этот атрибут имеет значение по умолчанию, вместо удаления происходит замещение: атрибуту просто устанавливается значение по умолчанию.
appendChild(newChildNode) Добавляет текущему узлу новый дочерний элемент и возвращает ссылку на этот элемент. То же самое можно сделать вызовом insertBefore(newChildNode, null).
insertBefore(newChildNode, refChildNode) Вставляет новый дочерний узел (newChildNode) перед указанным существующим дочерним узлом (refChildNode). Если последний параметр не задан, новый дочерний узел будет добавлен в конец.
replaceChild(newChildNode, oldChildNode) Заменяет указанный дочерний объект текущего элемента на новый и возвращает старый дочерний объект. Если новый дочерний объект — null, старый дочерний объект будет просто удалён.
removeChild(childNode) Удаляет указанный дочерний объект текущего элемента и возвращает его.

Все методы, которые создают новые объекты (createElement, createAttribute и подобные) не выполняют никакой работы, кроме непосредственно самого создания объектов. Для включения созданных объектов в документ надо дополнительно вызывать методы appendChild, insertBefore и подобные.

Пример создания нового XML-документа:

Добавим новый товар в начало нашего существующего «каталога товаров»:

Добавим новый товар в начало нашего существующего «каталога товаров» с помощью копирования:

Меняем местами, удаляем товары:

Обработка поддеревьев стилевыми таблицами

Описание
transformNode(objStylesheet) Назначает стилевую таблицу для текущего узла и возвращает строку — результат обработки. Текущим узлом может быть весь XML-документ.
transformNodeToObject(objStylesheet, objXMLDOMDocument) То же, что и transformNode, но результат не возвращается, а помещается в objXMLDOMDocument.

Применяем существующую стилевую таблицу к каталогу товаров:

Вывод товаров в обратном порядке с помощью XSL-сортировки:

Прочие свойства и методы

Перечень свойств и методов:

Описание
doctype Содержит объект XMLDOMDocumentType (узел DTD XML-документа). Только чтение. Если DTD в документе отсутствует, свойство содержит null. Только чтение.
url Содержит URL документа. Только чтение.
nodeFromID(idString) Возвращает узел по значению его атрибута типа ID (т.е. осуществляет поиск узла по ID) или Nothing, если узел не найден.
hasChildNodes() Возвращает True, если текущий узел имеет дочерние узлы, и False в противном случае.
specified Возвращает True, если текущий узел атрибута явно определён в тексте документа, и False в противном случае (если атрибут опущен и имеет значение по умолчанию, взятое из DTD).
normalize() Нормализует все текстовые узлы элемента (на любой глубине), объединяя два или больше смежных текстовых узла в один текстовый узел.

Примеры использования некоторых свойств и методов:

удаление doctype при сохранении domdocument

Я разбираю и извлекаю html-документы в DOMDocument. Эти документы представляют собой дочерние формы, которые будут отображаться внутри другой страницы. Сохраняя анализируемые DOMDocuments, он автоматически добавляет теги doctype, html, head и body. так как я работаю над дочерними формами, я хотел бы удалить все эти и сохранить только дочерние теги формы.

Как я могу пропустить автоматическую генерацию html, head, body и других тегов при сохранении domdocument?

То же, что и @KoolKabin, но немного короче:

Получил это сам после прочтения сотен ссылок. надеюсь, что это поможет и другим парням …

Начиная с PHP 5.4 и Libxml 2.6, в настоящее время существует более простой подход: когда вы загружаете html как это

в выводе не будет тегов doctype, html или body. источник

DOMDocument php, как получить содержимое блока, с html тегами?

Вообщем необходимо получить со страницы примерно такого содержания:


а именно необходимо получить содержимое блока с идентификатором «firstElement», вместе с HTML тегами. Я использую DOMDocument, но получается вывести только текст.

Подскажите пожалуйста, как правильно получить содержимое?

P.S. вложенных блоков может быть сколько угодно много! и у всех может быть разное содержание!

  • Вопрос задан более трёх лет назад
  • 7466 просмотров

Вот чудо методы для работы с дом-моделью в PHP.
Я не сильно понял вопрос, но благодаря всякой фигне, которая тут написана, мне удалось управлять DOM моделью в PHP.

Вам надо обратить внимание на всякие такие штуки как DOMElement. Потому, что получив DOMDocument веселье не кончается. Теперь вам надо наладить работу с его «Документа» элементами. А значит не помешает так же распочковать структуру всех искомых элементов.
Это можно делать с помощью методов работы с ДОМЕлементами. Такими методами как

public DOMNodeList getElementsByTagName ( string $name )

Но я советую более детально ознакомиться с возможностями работы с ДОМЕлементами, чтоб не вышло путаницы. Найти там то, что вам надо и решить свою задачу.

После публикации вопроса, прошло время и вот что я добился!
Перекурил документацию по php, и сделал вот так:

Тут я добился, что переменная $html — представляет собой ‘string’ со всем содержимым тут все понятно.

Но дальше необходимо вставить $html в другой документ в блок с известным идентификатором, рабочее решение будет с использованием регулярки (написана прям тут) таким:

А вот используя DOMDocument и все такое, я не могу вставить узел, не могу понять (или еще не дочитал) как! Причем пытаюсь использовать DOMNode::appendChild и передаю ей $id из кода выше, но не работает!

Что такое код domdocument >doctype

Спасибо большое Mag. Я сделал все по той ссылке которую вы поставили. Все работает, т.е пробелы можно ставить в тексте xml файла и при обновлении файла xml данные не стираются, как это было до этого. Только нижепоказанная ошибка еще появляется на экране . Незнаю как ее убрать:

Warning: DOMDocument::load() [domdocument.load]: Entity ‘nbsp’ not defined in file:///Z:/home/admin.loc/www/en/file1.xml, line: 6 in Z:\home\admin.loc\www\edit_page_en1.php on line 91

Добавлено 07.07.11, 11:59

Все спасибо я нашел решение проблемы. Вопрос решен!!

Класс DOMDocument

Введение

Представляет все содержимое HTML- или XML-документа; служит корнем дерева документа.

Обзор классов

Свойства

Устарело. Кодировка документа, является доступным только для чтения эквивалентом encoding .

Устарело. Конфигурация, используемая при вызове DOMDocument::normalizeDocument() .

Объявление типа документа, соответствующее этому документу.

Удобный атрибут, предоставляющий прямой доступ к дочернему узлу, как к элементу документа.

Расположение документа или NULL , если оно не определено.

Кодировка документа, как указано в объявлении XML. Этот атрибут отсутствует в последней спецификации DOM Level 3, но является единственным способом манипулирования кодировкой XML-документа в этой реализации.

Форматирует вывод, добавляя отступы и дополнительные пробелы.


Объект класса DOMImplementation, обрабатывающий этот документ.

Указание не убирать лишние пробелы и отступы. По умолчанию TRUE .

Проприетарное свойство. Включает режим восстановления, то есть пытается разобрать некорректно составленные (non-well formed) документы. Этот атрибут не является частью спецификации DOM и специфичен для libxml.

Установите в TRUE для загрузки внешних элементов из объявления типа документа. Может быть полезным при включении элементов с символьными данными в XML-документ.

Устарело. Указание, что документ не зависит от других XML-документов. Это можно определить из XML-объявления. Свойство связано с xmlStandalone .

Выбрасывает исключение DOMException при ошибках. По умолчанию TRUE .

Патентованное свойство. Указывает, заменять или нет элементы документа. Этот атрибут не является частью спецификации DOM и специфичен для libxml.

Загружает DTD и проверяет документ на соответствие. По умолчанию FALSE .

Устарело. Версия XML, соответствует xmlVersion .

Атрибут, определяющий, как часть XML-объявления, кодировку эту документа. Имеет значение NULL в случаях, когда атрибут не задан, либо значение неизвестно, если, например, документ создан в памяти.

Атрибут, определяющий, как часть XML-объявления, что документ является автономным. Принимает значение FALSE , если не указан.

Атрибут, определяющий, как часть XML-объявления, номер версии этого документа. Если объявления в документе нет, но есть поддержка всех особенностей «XML», значение равно «1.0».

Примечания

Расширение DOM использует кодировку UTF-8. Используйте функции utf8_encode() и utf8_decode() для работы с текстами в кодировке ISO-8859-1 или Iconv для других кодировках.

Смотрите также

Содержание

  • DOMDocument::__construct — Создает новый объект DOMDocument
  • DOMDocument::createAttribute — Создать новый атрибут
  • DOMDocument::createAttributeNS — Создает новый атрибут узла с соответствующим пространством имен
  • DOMDocument::createCDATASection — Создает новый узел cdata
  • DOMDocument::createComment — Создать новый узел комментария
  • DOMDocument::createDocumentFragment — Создать новый фрагмент документа
  • DOMDocument::createElement — Создать новый узел элемента
  • DOMDocument::createElementNS — Создать новый узел элемента с соответствующим пространством имен
  • DOMDocument::createEntityReference — Создать новый узел ссылки на сущность
  • DOMDocument::createProcessingInstruction — Создать новый PI-узел
  • DOMDocument::createTextNode — Создать новый текстовый узел
  • DOMDocument::getElementById — Ищет элемент с определенным идентификатором
  • DOMDocument::getElementsByTagName — Ищет все элементы с заданным локальным именем
  • DOMDocument::getElementsByTagNameNS — Ищет все элементы с заданным именем в указанном пространстве имен
  • DOMDocument::importNode — Импортировать узел в текущий документ

  • DOMDocument::load — Загрузка XML из файла
  • DOMDocument::loadHTML — Загрузка HTML из строки
  • DOMDocument::loadHTMLFile — Загрузка HTML из файла
  • DOMDocument::loadXML — Загрузка XML из строки
  • DOMDocument::normalizeDocument — Нормализует документ
  • DOMDocument::registerNodeClass — Регистрация расширенного класса, используемого для создания типа базового узла
  • DOMDocument::relaxNGValidate — Производит проверку документа на правильность построения посредством relaxNG
  • DOMDocument::relaxNGValidateSource — Проверяет документ посредством relaxNG
  • DOMDocument::save — Сохраняет XML-дерево из внутреннего представления в файл
  • DOMDocument::saveHTML — Сохраняет документ из внутреннего представления в строку, используя форматирование HTML
  • DOMDocument::saveHTMLFile — Сохраняет документ из внутреннего представления в файл, используя форматирование HTML
  • DOMDocument::saveXML — Сохраняет XML-дерево из внутреннего представления в виде строки
  • DOMDocument::schemaValidate — Проверяет действительность документа, основываясь на заданной схеме
  • DOMDocument::schemaValidateSource — Проверяет действительность документа, основываясь на схеме
  • DOMDocument::validate — Проверяет документ на соответствие его DTD
  • DOMDocument::xinclude — Проводит вставку XInclude в объекте DOMDocument

User Contributed Notes 16 notes

Showing a quick example of how to use this class, just so that new users can get a quick start without having to figure it all out by themself. ( At the day of posting, this documentation just got added and is lacking examples. )

// Set the content type to be XML, so that the browser will recognise it as XML.
header ( «content-type: application/xml; charset=ISO-8859-15» );

// «Create» the document.
$xml = new DOMDocument ( «1.0» , «ISO-8859-15» );

// Create some elements.
$xml_album = $xml -> createElement ( «Album» );
$xml_track = $xml -> createElement ( «Track» , «The ninth symphony» );

// Set the attributes.
$xml_track -> setAttribute ( «length» , «0:01:15» );
$xml_track -> setAttribute ( «bitrate» , «64kb/s» );
$xml_track -> setAttribute ( «channels» , «2» );

// Create another element, just to show you can add any (realistic to computer) number of sublevels.
$xml_note = $xml -> createElement ( «Note» , «The last symphony composed by Ludwig van Beethoven.» );

// Append the whole bunch.
$xml_track -> appendChild ( $xml_note );
$xml_album -> appendChild ( $xml_track );

// Repeat the above with some different values..
$xml_track = $xml -> createElement ( «Track» , «Highway Blues» );

$xml_track -> setAttribute ( «length» , «0:01:33» );
$xml_track -> setAttribute ( «bitrate» , «64kb/s» );
$xml_track -> setAttribute ( «channels» , «2» );
$xml_album -> appendChild ( $xml_track );

$xml -> appendChild ( $xml_album );

// Parse the XML.
print $xml -> saveXML ();

?>

Output:


The ninth symphony

The last symphony composed by Ludwig van Beethoven.


Highway Blues

If you want your PHP->DOM code to run under the .xml extension, you should set your webserver up to run the .xml extension with PHP ( Refer to the installation/configuration configuration for PHP on how to do this ).

Note that this:
= new DOMDocument ( «1.0» , «ISO-8859-15» );
$xml_album = $xml -> createElement ( «Album» );
$xml_track = $xml -> createElement ( «Track» );
$xml_album -> appendChild ( $xml_track );
$xml -> appendChild ( $xml_album );
?>

is NOT the same as this:
// Will NOT work.
$xml = new DOMDocument ( «1.0» , «ISO-8859-15» );
$xml_album = new DOMElement ( «Album» );
$xml_track = new DOMElement ( «Track» );
$xml_album -> appendChild ( $xml_track );
$xml -> appendChild ( $xml_album );
?>

although this will work:
= new DOMDocument ( «1.0» , «ISO-8859-15» );
$xml_album = new DOMElement ( «Album» );
$xml -> appendChild ( $xml_album );
?>


For those landing here and checking for encoding issue with utf-8 characteres, it’s pretty easy to correct it, without adding any additional output tag to your html.

We’ll be utilizing: mb_convert_encoding

Thanks to the user who shared: SmartDOMDocument in previous comments, I got the idea of solving it. However I truly wish that he shared the method instead of giving a link.

Anyway coming back to the solution, you can simply use:

// checks if the content we’re receiving isn’t empty, to avoid the warning
if ( empty( $content ) ) <
return false ;
>

// converts all special characters to utf-8
$content = mb_convert_encoding ( $content , ‘HTML-ENTITIES’ , ‘UTF-8’ );

// creating new document
$doc = new DOMDocument ( ‘1.0’ , ‘utf-8’ );

//turning off some errors
libxml_use_internal_errors ( true );

// it loads the content without adding enclosing html/body tags and also the doctype declaration
$doc -> LoadHTML ( $content , LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD );

// do whatever you want to do with this code now

?>

I hope it solves the issue for someone! If you need my help or service to fix your code, you can reach me on nabtron.com or contact me at the email mentioned with this comment.

Here’s a small function I wrote to get all page links using the DOMDocument which will hopefully be of use to others

/**
* get_links()
*
* @param string $url
* @return array
*/
function get_links ( $url ) <

// Create a new DOM Document to hold our webpage structure
$xml = new DOMDocument ();

// Load the url’s contents into the DOM
$xml -> loadHTMLFile ( $url );

// Empty array to hold all links to return
$links = array();

//Return the links
return $links ;
>
?>

For anyone else who has been having issues with formatOuput not working, here is a work-around:

rather than just doing something like:

= $xml -> saveXML ();
?>

force it to reload the XML from scratch, then it will format correctly:

= $xml -> saveXML ();
$xml = new DOMDocument ();
$xml -> preserveWhiteSpace = false ;
$xml -> formatOutput = true ;
$xml -> loadXML ( $outXML );
$outXML = $xml -> saveXML ();
?>

A nice and simple node 2 array I wrote, worth a try ;)

function getArray ( $node )
<
$array = false ;

if ( $node -> hasAttributes ())
<
foreach ( $node -> attributes as $attr )
<
$array [ $attr -> nodeName ] = $attr -> nodeValue ;
>
>

if ( $node -> hasChildNodes ())
<
if ( $node -> childNodes -> length == 1 )
<
$array [ $node -> firstChild -> nodeName ] = $node -> firstChild -> nodeValue ;
>
else
<
foreach ( $node -> childNodes as $childNode )
<
if ( $childNode -> nodeType != XML_TEXT_NODE )
<
$array [ $childNode -> nodeName ][] = $this -> getArray ( $childNode );
>
>
>
>

You may need to save all or part of a DOMDocument as an XHTML-friendly string, something compliant with both XML and HTML 4. Here’s the DOMDocument class extended with a saveXHTML method:

/**
* XHTML Document
*
* Represents an entire XHTML DOM document; serves as the root of the document tree.
*/
class XHTMLDocument extends DOMDocument <

/**
* These tags must always self-terminate. Anything else must never self-terminate.
*
* @var array
*/
public $selfTerminate = array(
‘area’ , ‘base’ , ‘basefont’ , ‘br’ , ‘col’ , ‘frame’ , ‘hr’ , ‘img’ , ‘input’ , ‘link’ , ‘meta’ , ‘param’
);

/**
* saveXHTML
*
* Dumps the internal XML tree back into an XHTML-friendly string.
*
* @param DOMNode $node
* Use this parameter to output only a specific node rather than the entire document.
*/
public function saveXHTML ( DOMNode $node = null ) <

if (! $node ) $node = $this -> firstChild ;

$doc = new DOMDocument ( ‘1.0’ );
$clone = $doc -> importNode ( $node -> cloneNode ( false ), true );
$term = in_array ( strtolower ( $clone -> nodeName ), $this -> selfTerminate );
$inner = » ;

if (! $term ) <
$clone -> appendChild (new DOMText ( » ));
if ( $node -> childNodes ) foreach ( $node -> childNodes as $child ) <
$inner .= $this -> saveXHTML ( $child );
>
>


$doc -> appendChild ( $clone );
$out = $doc -> saveXML ( $clone );

return $term ? substr ( $out , 0 , — 2 ) . ‘ />’ : str_replace ( ‘> , «> $inner , $out );

?>

This hasn’t been benchmarked, but is probably significantly slower than saveXML or saveHTML and should be used sparingly.

лишний DOCTYPE

доброе время суток такая проблема я пишу сайт преобразовываю xml с помощью xsl и обрабатываю все это в php

13.04.2011, 09:37

DOCTYPE
Где еще можно использовать doctype помимо веба?

какой DOCTYPE лучше
У меня тегов и атрибутов HTML5 на сайте нет, стоит ли мне в таком случае устанавливать тег.

!DOCTYPE
Доброго времени суток! Подскажите, пожалуйста, есть ли способ узнать какой у браузера !DOCTYPE по.

DOCTYPE и CSS
Люди у меня DOCTYPE конфликтует с CSS. Долго не мог понять почему body -> Text-Align -> center не.

18.04.2011, 18:16 2

3. открой xml браузером и в статике получишь HTML файл. Нужно поменять, меняй xsl — это расширенный стиль.
4. как добьешься сделаешь нужный html. удали инструкцию и пробуй соединить через РНР.
Результат должен быть одинаковый.

Почему важен DOCTYPE и как его правильно использовать

Решил проводить регулярные лекции и практические занятия со своими сотрудниками по программированию на PHP, MySQL, Javascript. А также другим технологиям необходимым для выпуска качественных сайтов. Начать решил с самого «верха», с HTML тэгов. Буду рад, любым комментариям :)
Сразу оговорюсь, что бОльшая часть информации я нашел в интернете, внизу статьи будут приведены ссылки на источники. Часть информации была переведена совместно с google translate.
Итак:

Почему так важен DOCTYPE

Вроде бы вы сделали все правильно, но ваш сайт почему-то не выглядит или не работает, как ожидалось, в последних версиях броузеров.
Вы написали правильный стандартный XHTML код и стандартный CSS. Вы воспользовались стандартной спецификацией для работы с DOM (Document Object Model), чтобы управлять динамическими элементами на странице. И все-таки, в броузерах, которые казалось бы сделаны с соблюдением именно этих стандартов, ваш сайт не работает. Скорей всего, ошибка кроется в неправильном заголовке DOCTYPE.
Эта небольшая статья расскажет вам о заголовках DOCTYPE, которые работают, а также объяснит практическое и теоретическое значение этого, казалось бы отвлеченного от реальности, тега.

Что такое DOCTYPE?

Согласно спецификациям HTML и XHTML тег DOCTYPE (что означает «объявление типа документа») сообщает валидатору, какую именно версию (X)HTML вы используете в своей странице. Этот тег должен всегда находиться в первой строке каждой страницы. Тег DOCTYPE — ключевой компонент web-страниц, претендующих на соответствие стандартам: без него ваш код и CSS не пройдут проверку валидатором.
Тег DOCTYPE также важен для правильного отображения и работы страницы в броузерах, соответствующих стандартам (Mozilla, IE5/Mac, и IE6/Win).
Тег DOCTYPE, в атрибутах которого указывается полный URI (полный web-адрес), сообщает броузерам, что страницу нужно вывести с соблюдением определенного стандарта или подвида этого стандарта.
Если вы будете пользоваться неполным тегом DOCTYPE, устаревшим его видом, или вообще забудете про него, броузер перейдет в «загадочный» (quirk) режим и будет исходить из предположения, что вы писали код страницы с ошибками и вольно отступали от стандартов, т.е. так, как писали в конце 90-ых годов.
В этом режиме броузер попытается разобрать вашу страницу по правилам обратной совместимости и выведет на экран, например, CSS так, как его вывел бы Internet Explorer 4-ой версии, а DOM будет работать так, как он работал именно в этом броузере (IE переключается в свой старый DOM, а Mozilla и Netscape 6 переключается вообще в бог знает что).
Понятно, что для вас эти выкрутасы не желательны. Но именно это вы и получите, если будете пользоваться неполным или неправильным тегом DOCTYPE.

Проблема

Когда создавали NN4, IE4 выполняли правила CSS не совсем в соответствии со стандартом. Реализация Netscape была просто ужасной, IE4 подошел к реализации стандарта лучше, но тем не менее, реализовал его не до конца. Хотя IE 5 Windows исправил множество ошибок IE 4, но оставались другие сбои в CSS (в основном в модели окон (window model)).
Поэтому, когда соответствие стандартам стало важным, W3C поставил производителей браузеров перед жестким выбором.
Приблизится к спецификации W3C было одним из решений проблемы, но если бы производители браузеров просто изменили реализацию CSS, чтобы соответствовать стандартам полностью, многие веб-сайты, «поползли» бы в большей или меньшей степени или оказались полностью неработоспособными. Такое сближение с соблюдением стандарта повлекло бы за собой проблемы. С другой стороны, не приведение к соответствию стандартов могло бы внести вечную путаницу в эпоху войны браузеров.

Решение

Поэтому решением этой проблемы было

  • позволить веб-разработчикам, которые знали о стандартах, выбирать какой режим использовать.
  • продолжать показывать старые страницы по старым (совместимым) правилам. (quirks mode)

Иными словами, всем браузерам необходимо было работать в двух режимах: режим совместимости для старых правил, и строгого режима для стандарта.
IE Mac был первым браузером использовавшим оба режима, а Windows IE 6, Mozilla, Safari, Opera и последовали его примеру.
IE 5 Windows, а также старые браузеры, как Netscape 4, постоянно заблокированы в режиме совместимости.

Решение о выборе, какой режим отображения требуется вызвать, было найдено в использовании «DOCTYPE» переключения. Согласно стандартам, любой (X) HTML документ должен иметь DOCTYPE который рассказывает всему миру, какой тип (X) HTML документа он использует.

Допустимые DTD

DOCTYPE Описание
HTML 4.01
www.w3.org/TR/html4/strict.dtd»> Строгий синтаксис HTML.
www.w3.org/TR/html4/loose.dtd»> Переходный синтаксис HTML.
www.w3.org/TR/html4/frameset.dtd»> В HTML-документе применяются фреймы.
XHTML 1.0
www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd»> Строгий синтаксис XHTML.
www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd»> Переходный синтаксис XHTML.
www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd»> Документ написан на XHTML и содержит фреймы.
XHTML 1.1
www.w3.org/TR/xhtml11/DTD/xhtml11.dtd»> Разработчики XHTML 1.1 предполагают, что он постепенно вытеснит HTML. Никакого деления на виды это определение не имеет, синтаксис один и подчиняется четким правилам.

HTML 4.01 DTDs

  • HTML 4.01 Strict — Не разрешает презентационной (оформительской) разметки, аргументируя тем, что этоим должен заниматься CSS.
  • Transitional DTD позволяет некоторые устаревшие аттрибуты и элементы
  • Если используются фреймы — должен быть использован frameset doctype

XHTML 1.0 DTDs

  • XHTML Strict DTD самый строгий существующий DTD: устаревшие (см ниже) теги не поддерживаются, и код должен быть написан правильно
  • XHTML Transitional DTD такой же как XHTML Strict DTD, но старые теги разрешены. Это НАИБОЛЕЕ ПОПУЛЯРНЫЙ в настоящий момент DTD.
  • XHTML Frameset DTD единственный XHTML DTD который поддерживает фреймы.


XHTML 1.1 DTD

Это новый DTD, который имеет строгость как у XHTML 1.0 Strict, и основан на фреймворке и модулях описанных в Modularization of XHTML (не стал искать что это такое :).

Статистика использования различных DTD

Получается что Более 50% сайтов работают в режиме quirk mode — то есть в режиме IE4!

Устаревшие тэги и аттрибуты

Устаревшие тэги в алфавитном порядке

используйте CSS.

  • используйте CSS.
  • используйте
      .
    • используйте CSS.
    • используйте CSS.
    • используйте в XHTML против DISABLED в HTML

  • У статьи отсутствует самый важный источник информации, w3.org, знакомство с ним могло бы сильно улучшить статью и убрать вопиющие ошибки, типа депрекейта на аттрибут type.

    Что такое DOCTYPE и зачем он нужен?

    Каждый, кто имеет дело с кодом, верстает или пока еще только учится верстать сайты, просто обязан знать о том, что в начале каждой HTML страницы перед тегом HTML должен стоять DOCTYPE.

    Что такое DOCTYPE и зачем он нужен?

    Строчка с DOCTYPE (Document Type Definition) в начале HTML страницы указывает на тип документа, который вы будете использовать при написании HTML кода для вашего сайта. Это непарный тег, то есть у него нет закрывающего тега.

    Нужно понимать, что строчка, в которой прописывается DOCTYPE — это не просто очередной HTML тег. Это важная инструкция, с помощью которой мы говорим браузеру, какая версия HTML использовалась при написании страницы.

    Главным преимуществом использования DOCTYPE является то, что ваш сайт будет правильно работать и одинаково ровно и красиво смотреться во всех браузерах.

    Какие существуют виды DOCTYPE?

    Cуществует несколько видов DOCTYPE. Есть строгие виды (strict), которые работают на основе только определенных тегов, есть переходные (transitional), которые допускают возможность включения дополнительных тегов, есть такие, которые работают с фреймами (frameset).

    Подробно в этой статье я не буду рассматривать каждый из них, так как это не является моей целью, просто перечислю:

    1. HTML 5
    2. HTML 4.01 Strict
    3. HTML 4.01 Transitional
    4. HTML 4.01 Frameset
    5. XHTML 1.0 Strict
    6. XHTML 1.0 Transitional
    7. XHTML 1.0 Frameset
    8. XHTML 1.1

    Подробную информацию по каждому виду DOCTYPE вы можете найти в интернете, просто введя в поиск нужную фразу, поэтому останавливаться на этом мы не будем.

    Итак, поехали дальше.

    Что касается использования разных видов DOCTYPE, следует иметь ввиду, что если вы изначально писали свой сайт в одном DOCTYPE, то не рекомендуется его менять в будущем на какой-то другой, потому что могут возникнуть проблемы с правильным отображением сайта из-за того, что вместе со сменой DOCTYPE вы автоматически поменяете правила обработки тегов браузерами.

    Когда вы выбираете тот или иной DOCTYPE, вы автоматически выбираете определенные правила, по которым должен анализироваться код в браузерах.

    Поэтому DOCTYPE нужно выбирать для сайта, изначально хорошенько подумав, в соответствии с тем, какой вам будет нужен вид обработки HTML кода браузерами, и впоследствии уже его не менять.

    Только представьте, сколько проблем раньше (почему раньше, объясню ниже в статье) несло верстальщику наличие нескольких видов DOCTYPE, между которыми приходилось постоянно выбирать, какой лучше использовать, и думать, не ошибся ли ты в своем выборе.

    Можно ли вообще обойтись без DOCTYPE?

    У тех, кто не любит заострять свое внимание на разных мелочах, может возникнуть вполне естественный вопрос: «А зачем мне все это нужно? Может, мне вообще не использовать DOCTYPE?»

    Конечно, теоретически можно его и не указывать, но тогда вы сидите на пороховой бочке замедленного действия, не зная точно когда она рванет (а рванет она 100%).

    Короче говоря, если вы не используете DOCTYPE совсем, то рискуете лицезреть созданный вами сайт не в самом приглядном виде в браузере, причем, в каждом браузере будут возникать разные проблемы с правильностью отображения, а решить все их вам будет, мягко говоря, сложновато.

    Так что же делать, если не хочется во все это вникать в подробностях?

    Преимущества использования DOCTYPE HTML5.

    Хорошая новость состоит в том, что с выходом последней версии HTML5 (которая, кстати, все еще находится в процессе разработки, по некоторым данным окончательный стандартный вариант обещают предоставить в 2014 году) стало намного удобней выбирать DOCTYPE для своих сайтов.

    Дело в том, что правила DOCTYPE HTML5 являются универсальными, включают в себя правила предыдущей версии, а также возможность работы с HTML 4 тегами и в какой-то степени с XHTML, и, насколько я понимаю, объединяют в себе возможности всех своих предшественников, адаптируя их для работы в новых браузерах.

    Поэтому сейчас, когда я верстаю, то уже не задумываюсь, какой тип DOCTYPE мне выбрать, а ставлю на первой строчке .

    Это все, что нужно написать, чтобы указать что это DOCTYPE HTML5. По сравнению с прежними своими собратьями, DOCTYPE HTML5 не основан на SGML (стандартном обобщённом языке разметки) , поэтому там нет тех данных, которые указывались до этого, а следовательно — в нем присутствует только короткая команда. И дальше уже идет сам документ:

    Согласитесь, что намного проще запомнить такую короткую строчку, чем каждый раз напрягаться , пытаясь вспомнить или найти где-то длинный код, который должен быть написан при использовании других версий.

    Что касается браузеров: как старые браузеры относятся к DOCTYPE HTML5? Не возникнут ли проблемы с этим?

    По этому поводу хочу сказать, что:

    1. Во-первых, мы должны равняться на прогресс и на будущее, а будущее — за новыми браузерами, и сейчас становится все-таки меньше и меньше людей, использующих старые браузеры.
    2. А во-вторых, Doctype HTML5 так устроен, что даже браузеры, которые в принципе не были созданы для того, чтобы поддерживать его (IE (начиная с IE8), старые версии FireFox, Opera, Safari), увидев команду , сразу же переключают содержимое в стандартный режим.

    Это значит, что если вы сегодня начнете создавать свои страницы на основе DOCTYPE HTML5, то можете быть уверены в том, что им обеспечена долгая жизнь.

    Выводы.

    Какой из всего вышесказанного мы можем сделать вывод?

    Использовать DOCTYPE необходимо, если не хотите впоследствии решать всяческие проблемы, связанные с его отсутствием (нужны они вам? ).

    И использовать лучше всего последнюю версию DOCTYPE HTML5.

    Очевидно, что многое изменилось и продолжает меняться к лучшему в этом направлении. Все это делается для того, чтобы облегчить нам с вами жизнь и сделать нашу работу максимально удобной, что рисует довольно яркие картины в перспективе!

    А потому желаю вам успехов!

    ЗЫ: Комментировать статью никто не запрещал !

    Добавить DocType в выходы DomDocument

    У меня класс Php нравится «Extension_DOMDocument», и это расширяет класс PHP «DOMDocument».

    Я создаю новый объект Extension_DOMDocument и добавляю к этому объекту DocType.

    Как я могу добавить DOCTYPE до $ objcDom?

    Создан 13 июл. 15 2015-07-13 15:18:55 pet21

    2 ответа

    Вы можете использовать реализацию DOM для создания объекта типа документа. Объекты типа документа все еще являются узлами DOM. Вы можете добавить их в существующий документ.

    Создан 13 июл. 15 2015-07-13 15:33:38 ThW

    Я хотел бы использовать эту

    Создан 26 май. 16 2020-05-26 13:24:46 YdB

    PHP DomDocument Вернуться Doctype

    Я думал, что это будет проще, чем это было или я над этим думать.

    Я пытаюсь вернуть то, что заявленная доктайп является для HTML страницы из URL. Если это что-нибудь другое, чем! DOCTYPE HTML добавить, что это будет! DOCTYPE HTML.

    Я попробовал несколько разных вещей . последнее время массива вернуться ниже, но независимо от страницы протестировала возвращаемый массив точно такие же, даже если полностью объявлен DOCTYPE не то же самое.

    Любые мысли о том, что я делаю неправильно или как исправить это было бы весьма признателен.

    Вам не нужно звонить htmlentities : $html = ‘ ‘; $doc = new DOMDocument(); $doc->loadHTML( $html ); $doctype = $doc->doctype; var_dump( $doctype );

    Илон Маск рекомендует:  Что такое код hw_close
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL