Парсинг ссылок из xml-карты сайта

Введение в XML¶

XML ( англ. eXtensible Markup Language) — расширяемый язык разметки,
предназначенный для хранения и передачи данных.

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

<?xml version="1.0" encoding="windows-1251"?>
category="WEB">
   lang="en">Learning XML

   Erik T. Ray
   2003
   

Первая строка — это XML декларация. Здесь определяется версия XML (1.0) и кодировка файла. На следующей строке описывается корневой элемент документа (открывающий тег). Следующие 4 строки описывают дочерние элементы корневого элемента ( , , , ). Последняя строка определяет конец корневого элемента (закрывающий тег).

Документ XML состоит из элементов (elements). Элемент начинается открывающим тегом (start-tag) в угловых скобках, затем идет содержимое (content) элемента, после него записывается закрывающий тег (end-teg) в угловых скобках.

Информация, заключенная между тегами, называется содержимым или значением элемента: . Т.е. элемент принимает значение . Элементы могут вообще не принимать значения.

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

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

Benchmark

report

file size fxp 3.0 validator (rps) fxp 3.0 parser (rps) xml2js 0.4.19 (rps)
1.5k 16581.06758 14032.09323 4615.930805
1.5m 14918.47793 13.23366098 5.90682005
13m 1.834479235 1.135582008 -1
1.3k with CDATA 30583.35319 43160.52342 8398.556349
1.3m with CDATA 27.29266471 52.68877009 7.966000795
1.6k with cdata,prolog,doctype 27690.26082 41433.98547 7872.399268
98m 0.08473858148 0.2600104004 -1

-1 indicates error or incorrect output.

report

file size fxp 3.2 js to xml xml2js 0.4.19 builder
1.3k 160148.9801 10384.99401
1.1m 173.6374831 8.611884025

Currently FXP fails to parse XML with attributes has «>» in the value. This problem is left open as change in regex for its fix is degrading the performance. And the parser become very slow in case of long attrbute names. Hoever, It is not ignored and we’re working on the fix.

  • : A standard to represent any number in the universe in comparitively less space and without precision loss. A standard to save memory to represent any text string in comparision of UTF encodings.
  • : Speedup and simplify image labeling / annotation. Supports multiple formats, one click annotation, easy interface and much more. There are more than half million images are being annotated every month using this tool.
  • : The fastest and simple router for node js web frameworks with many unique features.

Потоковые парсеры

Потоковые парсеры называются так потому, что они анализируют XML в потоке, во многом напоминая работу потокового аудио. В каждый момент времени они работают с одним отдельным узлом, а закончив, совершенно забывают о его существовании. XMLReader — это pull-парсер, и программирование для него во многом напоминает извлечение результата запроса к таблице базы данных при помощи курсора. Это облегчает работу с незнакомыми или непредсказуемыми XML-файлами.

Парсинг при помощи XMLReader

XMLReader — это потоковый парсер того типа, который часто называют курсорным или pull-парсером. XMLReader вытягивает информацию из XML-документа по требованию. Он основан на API, полученном из C# XmlTextReader. В PHP 5.1 он включен и задействован по умолчанию и основан на библиотеке libxml2. До выхода PHP 5.1 расширение XMLReader не было включено по умолчанию, но было доступно в PECL (см. ). XMLReader поддерживает пространства имен и проверку, включая DTD и Relaxed NG.

XMLReader в действии

Как потоковый парсер, XMLReader хорошо подходит для работы с объемными XML-документами; программировать в нем намного легче и обычно быстрее, чем в SAX. Это лучший потоковый парсер.

В следующем примере (листинг 10) объемный XML-документ анализируется при помощи XMLReader.

Листинг 10. XMLReader с объемным XML-файлом
<?php $reader = new XMLReader();
$reader->open("tooBig.xml");
while ($reader->read()) {
  switch ($reader->nodeType) {
  case (XMLREADER::ELEMENT):
     if ($reader->localName == "entry") {
        if ($reader->getAttribute("ID") == 5225) {
           while ($reader->read()) {
              if ($reader->nodeType == XMLREADER::ELEMENT) {
                 if ($reader->localName == "title") {
                    $reader->read();
                    echo $reader->value;
                    break;
                 }
                 if ($reader->localName == "entry") {
                    break;
                 }
              }
           }
        }
     }
  }
}
?>

Парсинг при помощи SAX

Simple API for XML (SAX) представляет собой потоковый парсер. События связаны с читаемым XML-документом, поэтому SAX программируется в стиле обратных вызовов. Существуют события для открывающих и закрывающих тегов элемента, сущностей и ошибок парсинга. Главная причина использования парсера SAX вместо XMLReader заключается в том, что парсер SAX иногда более эффективен и обычно лучше знаком. Важный недостаток — код для парсера SAX получается сложнее, и его труднее писать, чем для XMLReader.

SAX в действии

SAX должен быть знаком тем, кто работал с XML в PHP4, а расширение SAX
в PHP5 совместимо с версией, к которой они привыкли. Так как это потоковый парсер, он хорошо справляется с объемными файлами, но это не лучший выбор, чем XMLReader.

В листинге 11 приведен пример обработки объемного XML-документа парсером SAX.

Листинг 11. Использование SAX для анализа объемного XML-файла
<?php //Этот класс содержит все методы обратного вызова,
//которые автоматически управляют данными XML.
class SaxClass {
  private $hit = false;
  private $titleHit = false;

  //обратный вызов для начала каждого элемента
  function startElement($parser_object, $elementname, $attribute) {
     if ($elementname == "entry") {
        if ( $attribute == 5225) {
           $this->hit = true;
        } else {
           $this->hit = false;
        }
     }
     if ($this->hit && $elementname == "title") {
        $this->titleHit = true;
     } else {
        $this->titleHit =false;
     }
  }

  //обратный вызов для конца каждого элемента
  function endElement($parser_object, $elementname) {
  }

//обратный вызов для содержимого каждого элемента
  function contentHandler($parser_object,$data)
  {
     if ($this->titleHit) {
        echo trim($data)."";
     }
  }
}

//Функция запуска парсинга, когда все значения установлены
//и файл открыт
function doParse($parser_object) {
  if (!($fp = fopen("tooBig.xml", "r")));

  //прокрутка данных
  while ($data = fread($fp, 4096)) {
     //анализ фрагмента
     xml_parse($parser_object, $data, feof($fp));
  }
}

$SaxObject = new SaxClass();
$parser_object = xml_parser_create();
xml_set_object ($parser_object, $SaxObject);

//Не меняйте регистр данных
xml_parser_set_option($parser_object, XML_OPTION_CASE_FOLDING, false);

xml_set_element_handler($parser_object,"startElement","endElement");
xml_set_character_data_handler($parser_object, "contentHandler");

doParse($parser_object);

?>

Шаблоны в запросах(top)

Шаблонизатор Template Toolkit

  • $query — запрос после форматирования через общий формат результата
  • $query.num — порядковый номер запроса
  • $query.lvl — уровень вложенности запроса при использовании опций Parse to level или Parse all results
  • $query.orig — исходный запрос до форматирования
  • $query.first — первый запрос при использовании опций Parse to level или Parse all results
  • $query.prev — показывает запрос который был на предыдущем уровне, работает для HTML::LinkExtractor, tools.query.add и JS парсеров (this.query.add)
  • Все переменные, созданные через Конструктор запросов

Парсинг на примере книги

Что-ж, результат нашего примера немного скучный. Большую часть времени, вам нужно будет сохранить извлеченные данные, и сделать с ними что-нибудь, а не просто вывести его в stdout. Так что в следующем нашем примере мы создадим структуру данных для сбора результатов. В данном примере структура наших данных будет представлять собой список словарей. Мы используем пример книги MSDN. Сохраните следующий код XML под названием example.xml.

Python

<?xml version=»1.0″?>Gambardella, MatthewXML Developer’s GuideComputer44.952000-10-01An in-depth look at creating applications
with XML.Ralls, KimMidnight RainFantasy5.952000-12-16A former architect battles corporate zombies,
an evil sorceress, and her own childhood to become queen
of the world.Corets, EvaMaeve AscendantFantasy5.952000-11-17After the collapse of a nanotechnology
society in England, the young survivors lay the
foundation for a new society.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

xml version=»1.0″?>

catalog>

book id=»bk101″>

author>Gambardella,Matthewauthor>

title>XMLDeveloper’sGuidetitle>

genre>Computergenre>

price>44.95price>

publish_date>2000-10-01publish_date>

description>An in-depth look at creating applications

withXML.description>

book>

book id=»bk102″>

author>Ralls,Kimauthor>

title>Midnight Raintitle>

genre>Fantasygenre>

price>5.95price>

publish_date>2000-12-16publish_date>

description>Aformer architect battles corporate zombies,

an evil sorceress,andher own childhood to become queen

of the world.description>

book>

book id=»bk103″>

author>Corets,Evaauthor>

title>Maeve Ascendanttitle>

genre>Fantasygenre>

price>5.95price>

publish_date>2000-11-17publish_date>

description>After the collapse ofananotechnology

society inEngland,the young survivors lay the

foundation foranewsociety.description>

book>

catalog>

Теория и практика. Быстрая проверка задач и подсказки к ошибкам на русском языке.
Работает в любом современном браузере.

Теперь мы выполним парсинг данного XML и вставим его в нашу структуру данных!

Python

# -*- coding: utf-8 -*-
from lxml import etree

def parseBookXML(xmlFile):
with open(xmlFile) as fobj:
xml = fobj.read()

root = etree.fromstring(xml)

book_dict = {}
books = []
for book in root.getchildren():
for elem in book.getchildren():
if not elem.text:
text = «None»
else:
text = elem.text
print(elem.tag + » => » + text)
book_dict = text

if book.tag == «book»:
books.append(book_dict)
book_dict = {}

return books

if __name__ == «__main__»:
parseBookXML(«books.xml»)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29

# -*- coding: utf-8 -*-

fromlxml importetree

defparseBookXML(xmlFile)

withopen(xmlFile)asfobj

xml=fobj.read()

root=etree.fromstring(xml)

book_dict={}

books=

forbook inroot.getchildren()

forelem inbook.getchildren()

ifnotelem.text

text=»None»

else

text=elem.text

print(elem.tag+» => «+text)

book_dictelem.tag=text

ifbook.tag==»book»

books.append(book_dict)

book_dict={}

returnbooks

if__name__==»__main__»

parseBookXML(«books.xml»)

Данный пример весьма похож на предыдущий, так что мы сосредоточимся только на различиях между ними. Перед началом итерации над контекстом, мы создадим объект пустого словаря и пустой список Python. Далее, в цикле, мы создадим наш словарь вот так:

Python

book_dict = text

1 book_dictelem.tag=text

Текст может быть как elem.text так и None. Наконец, если тег окажется книгой, тогда мы в конце книжной секции, и нам нужно добавить словарь в наш список, а также сбросить словарь для следующей книги. Как мы видим, это именно то, что мы сделали. Более реалистичным примером будет размещение извлеченных данных в Python класс Book. Ранее я делал последнее с json feeds. Теперь мы готовы к тому, чтобы приступить к парсингу XML с lxml.objectify!

Что за ошибка парсинга?

Определена кодировка: windows-1251 (строка 0, столбец 0) Дата из файла: 2012-06-14 02:06 (строка 3, столбец 38) Ошибка: Обнаружен цикл в дереве категорий: категория 21 ссылается на категорию 21 (строка 8, столбец 7722) Фатальная ошибка: Фид отклонен»

При заполнении каталога была допущена ошибки и каталог А стал ссылаться на самого себя, что приводит к цикличности и ошибки проверки.

Исходя из указанного «зависшего каталога» с ID=21 выполним его удаление через панель управления магазином. Для этого выберете — — под основным окном в выпадающем меню выбираем . После знака = ставим ID каталога и жмем клавишу (в нашем случаи указываем 21)

Размещение Вашего магазина было приостановлено за повторяющиеся ошибки в прайс-листе. Фатальная ошибка: Ошибка парсинга XML: Error parsing XML feed: Expected entity name for reference (строка 8817, столбец 320) Формат XML требует соблюдения правил заполнения описания товара.

Открываем свой файл для яндекс-маркета http://имя сайта/yml/yandex.php любым браузером. Нажимаем в меню браузера опцию «Просмотр исходного кода страницы» и переходит к указанной строке (у нас указано в ошибке строка 8817). В этой строке нарушен синтаксис XML. Пример:

http://shop.ru/shop/UID_1781.html?from=yml850RUR25http://shop.ru/UserFiles/Image/img1781_16198s.jpgСлужебник.>   Аналойный, церковнославянский язык, двухцветная печать.

Ошибку вызывает тег

Нужно узнать номер товара (offer id=»1781″), найти его через админ-панель магазина через поиск 1781 и отредактировать описание товара, убрав лишние символы   . Если символы не видны в визуально редакторе, то перейти в режим html редактора. Сохранить изменения и отправить Яндексу на анализ снова.

  • Детали статьи

    Эта статья Вам помогла? ДА / НЕТ

  • Категория: Яндекс Маркет
  • Дата добавлена: 2012-06-14 09:51:10
  • Обзор: 4340
  • Рейтинг (Голоса): (33)

  Найти на сайте:

Учителям

Порядок наименования файла и структура Электронного Реестра

(на зачисление)

DBF1.Электронный Реестр должен быть сформирован в формате dBaseIII (*.DBF) (кодировка MS – DOS — 866) и подписан электронной подписью Предприятия (Организации).Наименование файла с Электронным Реестром получателей: fNNNNMMM.DBF1 где:

f специализированный отличительный символ;
NNNN номер филиала ОАО «Сбербанк России» где открыты Счета карт, на которые должны быть зачислены суммы, указанные в Электронном Реестре;
MMM порядковый номер Электронного Реестра.

Правила формирования порядкового номера Электронного Реестра устанавливаются Предприятием (Организацией) самостоятельно, при этом допускается использовать в номере как цифры, так и буквы латинского алфавита. В то же время, обязательным условием является обеспечение уникальности порядкового номера для каждого сформированного Электронного Реестра.2.Структура Электронного Реестра приведена в приложении А.

Файл формата DBF содержит 7 столбцов с наименованиями A,B,C,D,E,F,G (первые 7 символов латинского алфавита в верхнем регистре). Тип всех полей одинаковый – символьный, длиной 30 (тридцать) символов.

Строки Электронного Реестра с 1 по 6 содержат заголовок. Местоположение элементов заголовка приведено в порядке их расположения в соответствующих ячейках таблицы DBF и должно строго соблюдаться при формировании Электронного Реестра.

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

Кодировки¶

И еще один важный момент, который стоит рассмотреть — кодировки. Существует множество кодировок, о них подробнее можно прочитать в статье Набор
символов.

Самыми распространенными кириллическими кодировками являются и . Последняя является одним из стандартов, но большая часть ФНС отчетности имеет кодировку .

В XML файле кодировка объявляется в декларации:

<?xml version="1.0" encoding="windows-1251"?>

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

Таблица I.3 — Смена кодировки в разных программах
Программа Кодировка
Notepad++ «Документ → Кодировка»
Geany «Документ → Установить кодировку»
Firefox «Вид → Кодировка»
Chrome «Настройка → Дополнительные инструменты → Кодировка»

Основы XML-парсинга

Существует два основных способа XML-парсинга: на базе деревьев и на базе потоков. Метод дерева предусматривает загрузку в память всего XML-документа целиком. Древовидная структура файла позволяет произвольно обращаться к элементам документа и редактировать XML. Примерами парсеров по методу дерева служат DOM и SimpleXML. Они хранят древовидную структуру в памяти в разных, но взаимодействующих форматах. При поточном парсинге весь документ в память не загружается. В данном случае термин «поток» употребляется в том же смысле, что и при описании поточного аудио. Происходит то же самое и по тем же причинам: данные поступают мелкими порциями с целью экономии полосы пропускания и ресурсов памяти. При поточном парсинге доступен только тот узел, который анализируется в данный момент, а редактирование XML-документа целиком невозможно. Примерами поточных парсеров служат XMLReader и SAX.

Сущности¶

Некоторые символы в XML имеют особые значения и являются служебными. Если вы поместите,
например, символ внутри XML элемента, то будет
сгенерирована ошибка, так как парсер интерпретирует его, как начало
нового элемента.

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

 ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО"/>

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

Чтобы ошибки не возникали, нужно заменить символ на его
сущность. В XML существует 5 предопределенных сущностей:

Таблица I.1 — Сущности

Сущность
Символ
Значение

меньше, чем

больше, чем

амперсанд

апостроф

кавычки

Примечание

Только символы и строго запрещены в XML. Символ допустим, но лучше его всегда заменять на сущность.

Таким образом, корректными будут следующие формы записей:

 ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО"Мосавтогруз""/>

или

 ИННЮЛ="7718962261" КПП="771801001" НаимОрг="ООО«Мосавтогруз»"/>

Benchmark

XML to JSON

report

file size fxp 3.0 validator (rps) fxp 3.0 parser (rps) xml2js 0.4.19 (rps)
1.5k 16581.06758 14032.09323 4615.930805
1.5m 14918.47793 13.23366098 5.90682005
13m 1.834479235 1.135582008 -1
1.3k with CDATA 30583.35319 43160.52342 8398.556349
1.3m with CDATA 27.29266471 52.68877009 7.966000795
1.6k with cdata,prolog,doctype 27690.26082 41433.98547 7872.399268
98m 0.08473858148 0.2600104004 -1

-1 indicates error or incorrect output.

JSON to XML

report

file size fxp 3.2 js to xml xml2js 0.4.19 builder
1.3k 160148.9801 10384.99401
1.1m 173.6374831 8.611884025

Limitations

Currently FXP fails to parse XML with attributes has «>» in the value. This problem is left open as change in regex for its fix is degrading the performance. And the parser become very slow in case of long attrbute names. Hoever, It is not ignored and we’re working on the fix.

  • BigBit standard) : A standard to represent any number in the universe in comparitively less space and without precision loss. A standard to save memory to represent any text string in comparision of UTF encodings.
  • imglab : Speedup and simplify image labeling / annotation. Supports multiple formats, one click annotation, easy interface and much more. There are more than half million images are being annotated every month using this tool.
  • stubmatic : Create fake webservices, DynamoDB or S3 servers, Manage fake/mock stub data, Or fake any HTTP(s) call.
  • अनुमार्गक (anumargak) : The fastest and simple router for node js web frameworks with many unique features.
  • मुनीम (Muneem) : A webframework made for all team members. Fast and Featured.
  • शब्दावली (shabdawali) : Amazing human like typing effects beyond your imagination.

Описание и примеры¶

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

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

Приведем простой пример сортировки имен и фамилий.

Пример

Листинг 8.10. Входящий документ

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

Листинг 8.12. Выходящий документ

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

Значение ошибки Parser конфигурации?

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

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

Parser

Parsing is very simple.

Just call the method of the xml-parse instance.

const xml = require("xml-parse");

// Valid XML string
var parsedXML = xml.parse('<?xml version="1.0" encoding="UTF-8"?>' +
                          'Root Element');
console.log(parsedXML);

// Invalid XML string
var parsedInavlidXML = xml.parse('' +
                                 '' +
                                   '' +
                                 '');
console.log(parsedInavlidXML);

Parsed Object Structure

The result of is an object that maybe looks like this:

(In this case we have the xml string of the given example)

,
    innerXML '>',
    closing false,
    closingChar '?'
  },
  {
    type 'element',
    tagName 'root',
    attributes {},
    childNodes ,
    innerXML 'Root Element',
    closing true,
    closingChar null
  }
]

The root object is always an array because of the fact that it handles invalid xml with more than one root element.

Object Nodes

There are two kinds of objects. element and text.
An object has always the property .
The other keys depend from this type.

‘Element’ Object Node
{
  type , // "element"
  tagName , // The tag name of the tag
  attributes , // Object containing attributes as properties
  childNodes , // Array containing child nodes as object nodes ("element" or "text")
  innerXML , // The inner XML of the tag
  closing , // If the tag is closed typically ()
  closingChar  || null // If it is not closed typically, the char that is used to close it ("!" or "?")
}

Заключение

PHP5 предлагает большое разнообразие методов парсинга. Парсинг при помощи DOM, который теперь полностью совместим со стандартом W3C, — знакомый вариант, подходящий для сложных, но относительно компактных документов. SimpleXML — это способ работы с простыми и не слишком объемными документами, а потоковый парсер XMLReader, который легче и быстрее, чем SAX, предпочтителен для очень больших документов.

Похожие темы

  • Оригинал статьи (EN).
  • XML для PHP-разработчиков, часть 1: Работа с XML в PHPза 15 минут (Клифф Морган, developerWorks, февраль 2007 г.): В первой статье этой серии из трех частей рассказывается о реализации XML в РНР5 и о том, как легко работать с XML в среде РНР.
  • XML для PHP-разработчиков, часть 3: дополнительные методы чтения, организации и составления XML-документов (Клифф Морган, developerWorks, март 2007 г.): в заключительной части серии из трех статей об XML для РНР-разработчиков рассказывается о методах чтения, обработки и составления XML-документов в РНР5.(EN)
  • SAX, the power API (Benoît Marchal, developerWorks, август 2001 г.): Введение в SAX, сравнение DOM и SAX, инструкции по работе с SAX (EN).
  • Reading and writing the XML DOM in PHP (Jack Herrington, developerWorks, декабрь 2005 г.): Три метода чтения XML: библиотека DOM, синтаксический анализатор SAX и регулярные выражения. Также рассказывается, как писать XML с применением текстовых шаблонов DOM и PHP (EN).
  • What kind of language is XSLT (Michael Kay, developerWorks, апрель 2005 г.): Об истоках языка XSLT и его преимуществах (EN).
  • Tip: Implement XMLReader: An interface for XML converters (Benoît Marchal, developerWorks, ноябрь 2003 г.): В этой статье исследуются API для конвейеров XML и причины, по которым знакомый интерфейс XMLReader подходит для многих компонентов. (EN)
  • SimpleXML Processing with PHP (Elliotte Rusty Harold, developerWorks, октябрь 2006 г.): Расширение SimpleXML позволяет PHP-страницам обращаться к XML с запросами, вести в них поиск, модифицировать и повторно публиковать его (EN).
  • A PHP5 migration guide (Jack Herrington, developerWorks, September 2006 г.): Как перенести код, разработанный в PHP V4, на PHP V5, значительно улучшив его обслуживаемость и стабильность (EN).
  • Introducing Simple XML in PHP5 ( Alejandro Gervasio, Dev Shed, июнь 2006 г.): первая часть серии из трех статей, посвященных SimpleXML. Введение в расширение simplexml для РНР5 — библиотеку, предназначенную главным образом для синтаксического анализа простых XML-файлов (EN).
  • PHP Cookbook, Second Edition (Adam Trachtenberg and David Sklar, O’Reilly Media, август 2006 г.): О создании динамических Web-приложений, работающих с любыми Web-браузерами (EN).
  • XML.com: Сайт O’Reilly с обширной информацией по XML (EN).
  • W3C XML Information: Спецификация XML из первоисточника (EN).
  • Сайт, посвященный PHP-разработке (EN)
  • PEAR: PHP Extension and Application Repository: Подробные сведения о PEAR, среде разработки и системе дистрибуции РНР-компонентов (EN).
  • PECL: PHP Extension Community Library: Родственный сайт по PEAR и репозиторий расширений PHP (EN).
  • Planet PHP: Новости сообщества PHP-разработчиков (EN).
  • xmllib2: XML-парсер на языке C и набор инструментов от Gnome.(EN)
  • Сертификация IBM по XML: Как стать сертифицированным IBM разработчиком XML и родственных технологий. (EN)
  • Техническая библиотека по XML: Широкий спектр технических статей и рекомендаций, руководств, стандартов и технических руководств IBM в разделе XML сайта developerWorks. (EN)
  • Используйте в своем следующем Open Source-проекте ознакомительное ПО IBM, которое можно загрузить прямо с сайта developerWorks.(EN)

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

Подпишите меня на уведомления к комментариям

Ссылка на основную публикацию