Я пытаюсь конвертировать XML в JSON в PHP. Если я делаю простое преобразование с использованием простого xml и json_encode, ни один из атрибутов в xml не отобразится.
$xml = simplexml_load_file("states.xml");
echo json_encode($xml);
Поэтому я пытаюсь вручную разобрать это так.
foreach($xml->children() as $state)
{
$states[]= array('state' => $state->name);
}
echo json_encode($states);
и выход для государства, {"state":{"0":"Alabama"}}
а не{"state":"Alabama"}
Что я делаю не так?
XML:
<?xml version="1.0" ?>
<states>
<state id="AL">
<name>Alabama</name>
</state>
<state id="AK">
<name>Alaska</name>
</state>
</states>
Вывод:
[{"state":{"0":"Alabama"}},{"state":{"0":"Alaska"}
var dump:
object(SimpleXMLElement)#1 (1) {
["state"]=>
array(2) {
[0]=>
object(SimpleXMLElement)#3 (2) {
["@attributes"]=>
array(1) {
["id"]=>
string(2) "AL"
}
["name"]=>
string(7) "Alabama"
}
[1]=>
object(SimpleXMLElement)#2 (2) {
["@attributes"]=>
array(1) {
["id"]=>
string(2) "AK"
}
["name"]=>
string(6) "Alaska"
}
}
}
var_dump
отлично работает.)Ответы:
Json & Array из XML в 3 строки:
источник
<person my-attribute='name'>John</person>
интерпретируется как<person>John</person>
.@attributes
ключом, поэтому он работает абсолютно безупречно и красиво. 3 короткие строки кода прекрасно решают мою проблему.<list><item><a>123</a><a>456</a></item><item><a>123</a></item></list>
->{"item":[{"a":["123","456"]},{"a":"123"}]}
. Решение на php.net от ratfactor решает эту проблему, всегда сохраняя элементы в массиве.Извините за ответ на старый пост, но эта статья описывает подход, который является относительно коротким, лаконичным и простым в обслуживании. Я проверял это сам и работает довольно хорошо.
http://lostechies.com/seanbiefeld/2011/10/21/simple-xml-to-json-with-php/
источник
Я понял. json_encode обрабатывает объекты не так, как строки. Я бросил объект в строку, и теперь он работает.
источник
Думаю, я немного опоздал на вечеринку, но я написал небольшую функцию для выполнения этой задачи. Он также заботится об атрибутах, текстовом содержимом и даже, если несколько узлов с одинаковым именем узла являются братьями и сестрами.
Отказ от ответственности: я не PHP родной, поэтому, пожалуйста, терпите простые ошибки.
Пример использования:
Пример ввода (myfile.xml):
Пример вывода:
Довольно напечатано:
Причуды для запоминания: несколько тегов с одним и тем же тегом могут быть братьями и сестрами. Другие решения, скорее всего, отбросят всех, кроме последнего брата. Чтобы избежать этого, каждый отдельный узел, даже если у него только один дочерний узел, представляет собой массив, содержащий объект для каждого экземпляра тэга. (См. Несколько элементов "" в примере)
Даже корневой элемент, из которых только один должен существовать в действительном XML-документе, хранится в виде массива с объектом экземпляра, чтобы иметь согласованную структуру данных.
Чтобы иметь возможность различать содержимое узла XML и атрибуты XML, каждый атрибут объекта хранится в «$», а содержимое - в дочернем «_».
Изменить: я забыл показать вывод для вашего примера входных данных
источник
$xml = simplexml_load_file("myfile.xml",'SimpleXMLElement',LIBXML_NOCDATA);
.Fatal error: Uncaught Error: Call to a member function getName() on bool
.. Я думаю, что версия PHP провал :-( .. Пожалуйста, помогите!Распространенная ловушка - забывать, что
json_encode()
не учитываются элементы с текстовым значением и атрибутом (ами). Он выберет один из них, что означает потерю данных. Функция ниже решает эту проблему. Если кто-то решит пойти по путиjson_encode
/decode
, рекомендуется следующая функция.таким образом,
<foo bar="3">Lorem</foo>
не будет в конечном итоге, как{"foo":"Lorem"}
в вашем JSON.источник
$dom
? Откуда это пришло?Попробуйте использовать это
Или
Вы можете использовать эту библиотеку: https://github.com/rentpost/xml2array
источник
Для этой цели я использовал TypeConverter от Майлза Джонсона . Это можно установить с помощью Composer .
Вы можете написать что-то вроде этого, используя это:
источник
Оптимизация ответа Антонио Макса:
источник
Если вы хотите преобразовать только определенную часть XML в JSON, вы можете использовать XPath, чтобы извлечь это и преобразовать в JSON.
Обратите внимание, что если ваш Xpath неверен, он умрет с ошибкой. Поэтому, если вы отлаживаете это с помощью вызовов AJAX, я рекомендую вам также регистрировать тела ответов.
источник
источник
Лучшее решение, которое работает как шарм
Источник
источник
Это улучшение наиболее одобренного решения Антонио Макса, которое также работает с XML, имеющим пространства имен (заменяя двоеточие подчеркиванием). Он также имеет некоторые дополнительные параметры (и анализирует
<person my-attribute='name'>John</person>
правильно).источник
<element/>
, не может адресовать элементы, которые начинаются с символов подчеркивания или содержат их, что разрешено в XML. Не в состоянии обнаружить CDATA. И как я уже сказал, это МЕДЛЕННО. Это сложность O (n ^ 2) из-за внутреннего разбора.Все решения здесь имеют проблемы!
... Когда представление нуждается в совершенной интерпретации XML (без проблем с атрибутами) и для воспроизведения всего text-tag-text-tag-text -... и порядка тегов. Также хорошо помните, что объект JSON "является неупорядоченным набором" (не повторяющиеся ключи и ключи не могут иметь предопределенный порядок) ... Даже xml2json в ZF неверен (!), Поскольку не сохраняет точно структуру XML.
Все решения здесь имеют проблемы с этим простым XML,
... Решение @FTav кажется лучше, чем решение с 3 строками, но при тестировании с этим XML также есть небольшая ошибка.
Старое решение является лучшим (для представления без потерь)
Решение, известное сегодня как jsonML , используется проектом Zorba и другими и впервые было представлено в 2006 или 2007 году (отдельно) Стивеном МакКэми и Джоном Снелсоном .
Производить
См. Http://jsonML.org или github.com/mckamey/jsonml . Правила производства этого JSON основаны на элементе JSON-аналог,
Этот синтаксис является элементом определения и повторения, с
element-list ::= element ',' element-list | element
.источник
Изучив немного все ответы, я нашел решение, которое прекрасно работало с моими функциями JavaScript в разных браузерах (включая консоли / инструменты разработки):
Он в основном создает новый DOMDocument, загружает и XML-файл в него и проходит через каждый из узлов и дочерних элементов, получая данные / параметры и экспортируя их в JSON без раздражающих знаков «@».
Ссылка на файл XML .
источник
Это решение обрабатывает пространства имен, атрибуты и выдает согласованный результат с повторяющимися элементами (всегда в массиве, даже если есть только одно вхождение). Вдохновлено sxiToArray от ratfactor () .
Пример:
источник
Нашел ответ FTav наиболее полезным, поскольку он очень настраиваемый, но у его функции xml2js есть некоторые недостатки. Например, если дочерние элементы имеют одинаковые тэги, все они будут сохранены в одном объекте, это означает, что порядок элементов не будет сохранен. В некоторых случаях мы действительно хотим сохранить порядок, поэтому лучше хранить данные каждого элемента в отдельном объекте:
Вот как это работает. Исходная структура XML:
Результат JSON:
источник
Похоже,
$state->name
переменная содержит массив. Ты можешь использоватьвнутри
foreach
чтобы проверить это.Если это так, то вы можете изменить линию внутри
foreach
Toисправить это.
источник
источник
Если вы пользователь Ubuntu, установите xml reader (у меня есть php 5.6. Если у вас есть другие, пожалуйста, найдите пакет и установите)
источник