Преобразование XML в JSON в PHP SimpleXML

$data = "<QRYRESULT> <ISSUCCESS>Y</ISSUCCESS> <EBLCUSTOMER ACCOUNTNO='11111'> <CUSTACCTNO>121212</CUSTACCTNO> <ACCTSTATUS>active</ACCTSTATUS> <CCYDESC>BDT</CCYDESC> <BALANCE>9999</BALANCE> <AVAILABLEBALANCE>99</AVAILABLEBALANCE> <CUSTOMERNAME>cus_name</CUSTOMERNAME> <AMOUNTONHOLD>1000</AMOUNTONHOLD> <ODLIMIT>99</ODLIMIT> </EBLCUSTOMER> </QRYRESULT>"; 

это строка XML, которую я пытаюсь преобразовать. Я использовал код folloung.

  $result = str_replace(array("\n", "\r", "\t"), '', $data); $xml = simplexml_load_string($result); $object = new stdclass(); $object->webservice[] = $xml; $result = json_encode($object); header('content-Type: application/json'); echo $result; 

И я получаю следующие данные json.

  { "webservice": [ { "ISSUCCESS": "Y", "CUSTSUMMARY": { "@attributes": { "ACCOUNT": "11111" }, "IDACCOUNT": "1010101", "CODACCTCURR": "BDT", "NUMBALANCE": "99999", "ACCTDESC": "22222", "PRDNAME": "name" } } ] } 

Но я не хочу «@attributes». Мне нужен вывод, как показано ниже:

 { "QRYRESULT": { "ISSUCCESS": "Y", "EBLCUSTOMER": { "-ACCOUNTNO": "11111", "CUSTACCTNO": "121212", "ACCTSTATUS": "active", "CCYDESC": "BDT", "BALANCE": "9999", "AVAILABLEBALANCE": "99", "CUSTOMERNAME": "cus_name", "AMOUNTONHOLD": "1000", "ODLIMIT": "99" } } } 

Как я могу это сделать ?

Вы не хотите иметь поле « @attributes », закодированное в JSON, однако это стандартный способ, которым PHP JSON сериализует SimpleXMLElement.

Как вы говорите, вы хотите изменить это, вам нужно изменить способ, как PHP JSON сериализует объект. Это возможно, реализуя JsonSerializable с помощью SimpleXMLElement самостоятельно, а затем предоставляйте сериализацию JSON по своему усмотрению:

 class JsonSerializer extends SimpleXmlElement implements JsonSerializable { /** * SimpleXMLElement JSON serialization * * @return null|string * * @link http://php.net/JsonSerializable.jsonSerialize * @see JsonSerializable::jsonSerialize */ function jsonSerialize() { // jishan's SimpleXMLElement JSON serialization ... return $serialized; } } 

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

Затем вы можете легко интегрировать его, например, вместо

 $xml = simplexml_load_string($result); 

вы можете использовать

 $xml = simplexml_load_string($result, 'JsonSerializer'); 

или просто

 $xml = new JsonSerializer($result); 

а остальная часть вашей функции работает одинаково, но только с вашей сериализацией.

Пример:

 $result = str_replace(array("\n", "\r", "\t"), '', $data); $xml = new JsonSerializer($result); $object = new stdclass(); $object->webservice[] = $xml; $result = json_encode($object, JSON_PRETTY_PRINT); header('content-Type: application/json'); echo $result; 

Вывод:

 { "webservice": [ { "EBLCUSTOMER": { "ACCOUNTNO": "11111", "CUSTACCTNO": "121212", "ACCTSTATUS": "active", "CCYDESC": "BDT", "BALANCE": "9999", "AVAILABLEBALANCE": "99", "CUSTOMERNAME": "cus_name", "AMOUNTONHOLD": "1000", "ODLIMIT": "99" } } ] } 

Функция сериализации для приведенного выше примера:

 function jsonSerialize() { // text node (or mixed node represented as text or self closing tag) if (!count($this)) { return $this[0] == $this ? trim($this) : null ; } // process all child elements and their attributes foreach ($this as $tag => $element) { // attributes first foreach ($element->attributes() as $name => $value) { $array[$tag][$name] = $value; } // child elements second foreach($element as $name => $value) { $array[$tag][$name] = $value; } } return $array; } 

Некоторые примечания здесь:

  • В сериализации вы должны позаботиться о том, какой тип элемента принадлежит вам. Дифференциация выполняется сверху для отдельных элементов без детей. Если вам нужна обработка атрибутов, вам нужно добавить его.
  • trim($this) возможно, уже избавляет вас от проблемы, которую вы пытаетесь поймать с помощью $result = str_replace(array("\n", "\r", "\t"), '', $data); , SimpleXMLElement в любом случае будет JSON-сериализовать символы « \r » ( SimpleXMLElement использует « \n » для разрывов). Кроме того, вас могут интересовать правила нормализации пробелов в XML .
  • Если атрибут имеет то же имя, что и дочерний элемент, он будет перезаписан дочерним элементом.
  • В случае дочернего элемента, который следует за другим дочерним элементом с тем же именем, он будет перезаписан.

Два последних момента – просто сохранить простой пример кода. Способ, который выровнен по стандартной сериализации PHP JSON для SimpleXMLElement , приведен в ряде моих сообщений в блоге.

Основы именно этой процедуры и примерная реализация JsonSerialize доступны в третьем посте: SimpleXML и JSON Encode в PHP – часть III и конец .

Другой связанный с этим вопрос:

  • PHP конвертирует XML в группу JSON, когда есть один ребенок