Библиотека PHP для синтаксического анализа XML с двоеточиями в именах тегов? [дубликат]


На этот вопрос уже есть ответ здесь:

Я пытался использовать SimpleXML, но, похоже, XML выглядит так:

<xhtml:div>sample <xhtml:em>italic</xhtml:em> text</xhtml:div>

Итак, какая библиотека будет обрабатывать теги, которые выглядят так (в них есть двоеточие)?

Author: Josh Davis, 2009-10-16

4 answers

Допустим, у вас есть такой xml-файл.

<xhtml:div>
  <xhtml:em>italic</xhtml:em>
  <date>2010-02-01 06:00</date>
</xhtml:div>

Вы можете получить к ним доступ вот так: $xml->children('xhtml', true)->div->em;

Однако, если вам нужно поле даты, это: $xml->children('xhtml', true)->div->date; не будет работать, потому что вы застряли в пространстве имен xhtml.

Вы должны снова выполнить "дочерние элементы", чтобы вернуться в пространство имен по умолчанию:

$xml->children('xhtml', true)->div->children()->date;
 67
Author: Nathan, 2014-11-24 02:55:02

Если вы хотите быстро это исправить, сделайте это (Я делаю это, когда мне лень):

// Will replace : in tags and attributes names with _ allowing easy access
$xml = preg_replace('~(</?|\s)([a-z0-9_]+):~is', '$1$2_', $xml);

Это преобразует <xhtml: в <xhtml_ и </xhtml: в </xhtml_. Своего рода хаки и может потерпеть неудачу, если задействованы блоки XML-контейнеров с пространством имен CDATA или имена тегов UNICODE, но я бы сказал, что вы обычно безопасно используете его (еще не подвел меня).

 20
Author: EarnestoDev, 2011-08-28 01:07:54

Двоеточие обозначает пространство имен XML. DOM имеет хорошую поддержку пространств имен.

 6
Author: Ollie Saunders, 2009-10-16 00:10:42

Я не думаю, что это хорошая идея - избавиться от толстой кишки или заменить ее чем-то другим, как предлагали некоторые люди. Вы можете легко получить доступ к элементам, имеющим префикс пространства имен. Вы можете либо передать URL-адрес, идентифицирующий пространство имен, в качестве аргумента методу children(), либо передать префикс пространства имен и "true" методу children(). Второй подход требует PHP 5.2 и выше.

Элемент SimpleXMLElement::дети

 1
Author: Patryk K, 2013-02-22 14:47:40