Просто чтобы убедиться, что мы на одной странице, у вас есть три ситуации.
Вставка амперсанда в атрибут с помощью addAttribute
Вставка амперсанда в элемент с помощью addChild
Вставка амперсанда в элемент путем перегрузки свойства
Это несоответствие между 2 и 3 приводит вас в замешательство. Почему addChild автоматически не экранирует амперсанд, а добавление свойства к объекту и установка его значения автоматически экранирует амперсанд?
Исходя из моих инстинктов и пользуясь этой ошибкой , это было обдуманное дизайнерское решение. Перегрузка свойств ($ a-> d = 'Five & Six';) предназначена для того, чтобы "избегать использования амперсандов для меня". Метод addChild предназначен для добавления метода «добавь именно то, что я тебе говорю». Таким образом, в зависимости от того, какое поведение вам нужно, SimpleXML может удовлетворить вас.
Допустим, у вас была база данных с текстом, в которой все амперсанды уже были экранированы. Автопробег не сработает для вас. Вот где вы бы использовали addChild. Или допустим, что вам нужно вставить объект в ваш документ
$a = simplexml_load_string('<root></root>');
$a->b = 'This is a non-breaking space ';
$a->addChild('c','This is a non-breaking space ');
print $a->asXML();
Это то, что PHP разработчик в этой ошибке защищает. Поведение addChild предназначено для предоставления «менее простой, более надежной» поддержки, когда вам нужно вставить амперсанд в документ без его экранирования.
Конечно, это оставляет нас с первой упомянутой мной ситуацией, методом addAttribute. Метод addAttribute делает экранированием амперсандов. Итак, теперь мы можем заявить о несоответствии как
- Метод addAttribute экранирует амперсанды
- Метод addChild не экранирует амперсанды
- Это поведение несколько противоречиво. Разумно, что пользователь ожидал бы, что методы в SimpleXML будут избегать вещей согласованным образом
В этом случае выявляется реальная проблема с API SimpleXML. Идеальная ситуация здесь будет
- Перегрузка свойств на элементных объектах ускользает от амперсандов
- Перегрузка свойств в объектах атрибутов ускользает от амперсандов
- Метод addChild не экранирует амперсанды
- метод addAttribute не экранирует амперсанды
Это невозможно, потому что SimpleXML не имеет понятия объекта атрибута. Метод addAttribute является (кажется?) Единственным способом добавления атрибута. Из-за этого оказывается (кажется?) SimpleXML неспособным создавать атрибуты с сущностями.
Все это раскрывает парадокс Simple XML. Идея этого API состояла в том, чтобы предоставить простой способ взаимодействия с чем-то, что оказывается сложным.
Команда могла бы добавить объект SimpleXMLAttribute, но это дополнительный уровень сложности. Если вы хотите иерархию нескольких объектов, используйте DomDoument.
Команда могла бы добавить флаги в методы addAttribute и addChild, но флаги делают API более сложным.
Настоящий урок здесь? Может быть, это так просто, это сложно, а просто в срок еще сложнее. Я не знаю, так ли это было, но с SimpleXML кажется, что кто-то начал с простой идеи (используйте перегрузку свойств, чтобы упростить создание документов XML), а затем скорректировал ее по мере поступления запросов о проблемах / функциях .
На самом деле, я думаю, что настоящий урок здесь заключается в том, чтобы просто использовать JSON;)