LINUX.ORG.RU

Как получить атрибут элемента из DOM в явном виде, без преобразования спецсимволов?

 , , , , спецсимволы


0

2

Есть у меня XML-документы, в которых могут встречаться такие вещи:

<item id="14925" name="&lt;table&gt; - создание таблиц"/>

Когда идет разбор данного XML через DOM, значение атрибута name получается с помощью вот такого кода:
$name=$currElement->getAttribute("name");

Проблема в том, что метод getAttribute() автоматически преобразует строку атрибута так, что спецсимволы в строке атрибута будут преобразованы в настоящие символы. И поэтому в переменной $name будет значение:
"<table> - создание таблиц"

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

Вот тут похожая проблема, но ответа никто не знает: https://ru.stackoverflow.com/questions/822685/domelementsetattribute-добавить...

Вопрос: как получить значение атрибута из DOM в явном виде?

★★★★★
$attrNode = $currElement->getAttributeNode('name');
$attrValue = $attrNode->textContent;
sanwashere ★★
()

Может, не надо? XML — это, на самом деле, не текст, а дерево объектов, которое по недоразумению кодируют в получитабельном виде; и в этом дереве объектов никакого «преобразования» уже нет. Получение текста до преобразования — это будет скорее баг, чем фича.

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Получение текста до преобразования — это будет скорее баг, чем фича

Тоже согласен с этой точкой зрения. Поведение конкретных версий конкретных движков и библиотек по поводу отработки свойства textContent запросто может измениться в будущих версиях. Если уж так хочется получить «&lt;table&gt;», то лучше воспользоваться методом getAttribute и сделать обратное преобразование. Тут, на самом деле, существенно, что вы потом собираетесь делать с этим текстом...

vinvlad ★★
()
Ответ на: комментарий от sanwashere

Согласно https://www.w3.org/TR/2004/REC-DOM-Level-3-Core-20040407/core.html#Node3-text... поведение изменяться не будет, так что textContent должен быть нормальным вариантом.

У вас логическая ошибка в рассуждении. Вы ссылаетесь на W3C-спецификацию (которая действительно меняться не будет), а вывод делаете относительно поведения разных версий программного продукта. Вы никогда не встречали несоответствия ПО спецификации W3C?

Я просто предварительно достаточно внимательно просмотрел спецификацию и не нашёл в ней однозначного, явного утверждения относительно того, что свойство textContent должно возвращать именно строку «&lt;table&gt; ...» - в UTF-формате. Возможно, я что-то недосмотрел или читал слишком поверхностно - тогда бросьте более конкретные ссылочки.

Если посмотреть, к примеру, developer.android.com - EntityReference, то там говортся следующее:

EntityReference nodes may be used to represent an entity reference in the tree. Note that character references and references to predefined entities are considered to be expanded by the HTML or XML processor so that characters are represented by their Unicode equivalent rather than by an entity reference. Moreover, the XML processor may completely expand references to entities while building the Document, instead of providing EntityReference nodes.

vinvlad ★★
()
Ответ на: комментарий от sanwashere

... но «чище» способа получить исходное значение, увы, не видно

Насколько я понимаю, TC-у на самом деле нужно просто получить в PHP фрагмент текста, который можно будет потом безопасно вставлять в HTML. Ну так для этого в PHP есть функции htmlspecialchars() и htmlentities().

vinvlad ★★
()
Ответ на: комментарий от vinvlad

По этому поводу согласен, защищаться за счёт парсера HTML/XML - это странно.

sanwashere ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.