পিএইচপি এক্সএমএলকে জেএসএনে রূপান্তর করে


157

আমি পিএইচপি-তে এক্সএমএলকে জসন রূপান্তর করার চেষ্টা করছি। যদি আমি সাধারণ এক্সএমএল এবং জসন_কোড ব্যবহার করে একটি সাধারণ রূপান্তর করি তবে এক্সএমএল শোতে কোনও বৈশিষ্ট্য নেই।

$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 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"}

বার ডাম্প:

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কাজ করে।)
nikc.org

যুক্ত ইনপুট, আউটপুট এবং var_dump
ব্রায়ান

কিছু অ্যাপ্লিকেশনগুলির জন্য "পারফেক এক্সএমএল-থেকে- জেএসএন মানচিত্র" দরকার , এটি জসনএমএল , সমাধান দেখুন এখানে
পিটার ক্রাউস

উত্তর:


472

এক্সএমএল থেকে 3 লাইনে জসন এবং অ্যারে:

$xml = simplexml_load_string($xml_string);
$json = json_encode($xml);
$array = json_decode($json,TRUE);

58
এই সমাধানটি ত্রুটিযুক্ত নয়। এটি এক্সএমএল বৈশিষ্ট্যগুলি সম্পূর্ণভাবে বাতিল করে দেয়। সুতরাং <person my-attribute='name'>John</person>হিসাবে ব্যাখ্যা করা হয় <person>John</person>
জ্যাক উইলসন

13
$ এক্সএমএল = সিম্পল এক্সএমএল_লোড_স্ট্রিং ($ এক্সএমএল_ স্ট্রিং, 'সিম্পল এক্সএমলেমেন্ট', এলআইবিএক্সএমএল_নোকডেটা); সিডিটা উপাদান সমতল করতে।
txyoji

28
@ জ্যাকউইলসন সম্ভবত এটি 2 বছর কেটে গেছে এবং বিভিন্ন সংস্করণ সংশোধন করেছে, কিন্তু পিএইচপি 5.6.30 এ এই পদ্ধতিটি সমস্ত তথ্য তৈরি করে। বৈশিষ্ট্যগুলি @attributesকী এর নীচে অ্যারেতে সংরক্ষণ করা হয় , সুতরাং এটি একেবারে নির্দোষ এবং সুন্দরভাবে কাজ করে। কোডের 3 টি লাইন আমার সমস্যাটিকে সুন্দরভাবে সমাধান করে।
আলেকজান্ডার

1
'(এই আপনি যদি একাধিক নামব্যবধান আছে, আপনি যদি শুধুমাত্র একটি চয়ন করতে পারেন, যা $ json_string মধ্যে পাস হবে কাজ করে না
jirislav

1
মনে রাখবেন যে এই সমাধানের সাহায্যে, যখন একই নামের একাধিক নোড থাকতে পারে, তখন একটি নোডের ফলে কীটি কেবল কোনও উপাদানের দিকে নির্দেশিত হয় তবে একাধিক নোডের ফলে মূল অ্যারের দিকে কী নির্দেশ করা যায় : <list><item><a>123</a><a>456</a></item><item><a>123</a></item></list>-> {"item":[{"a":["123","456"]},{"a":"123"}]}র‌্যাফ্যাক্টর দ্বারা পিএইচপি.net এ একটি সমাধান সর্বদা অ্যারেতে উপাদান সংরক্ষণ করে সেই সমস্যাটি সমাধান করে।
ক্লেসুন

37

কোনও পুরানো পোস্টের উত্তর দেওয়ার জন্য দুঃখিত, তবে এই নিবন্ধটি এমন একটি পদ্ধতির রূপরেখা তৈরি করেছে যা তুলনামূলকভাবে সংক্ষিপ্ত, সংক্ষিপ্ত এবং বজায় রাখা সহজ। আমি নিজে এটি পরীক্ষা করেছিলাম এবং বেশ ভাল কাজ করি।

http://lostechies.com/seanbiefeld/2011/10/21/simple-xml-to-json-with-php/

<?php   
class XmlToJson {
    public function Parse ($url) {
        $fileContents= file_get_contents($url);
        $fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents);
        $fileContents = trim(str_replace('"', "'", $fileContents));
        $simpleXml = simplexml_load_string($fileContents);
        $json = json_encode($simpleXml);

        return $json;
    }
}
?>

4
আপনার এক্সএমএলে যদি একই ট্যাগটির একাধিক উদাহরণ থাকে তবে এটি কাজ করবে না, জসন_নকোড কেবল ট্যাগের শেষ ঘটনাটি সিরিয়াল করে দেবে।
এথ্রি

34

আমি এটি বের করেছিলাম। json_encode স্ট্রিংয়ের চেয়ে পৃথকভাবে জিনিসগুলি পরিচালনা করে। আমি বস্তুকে স্ট্রিংয়ে ফেলেছি এবং এটি এখন কাজ করে।

foreach($xml->children() as $state)
{
    $states[]= array('state' => (string)$state->name); 
}       
echo json_encode($states);

19

আমার ধারণা আমি পার্টিতে কিছুটা দেরি করেছি তবে এই কাজটি সম্পাদন করার জন্য আমি একটি ছোট ফাংশন লিখেছি। এটি বৈশিষ্ট্যগুলি, পাঠ্য সামগ্রী এবং একই নোড-নামযুক্ত একাধিক নোড ভাই-বোন হয়ে থাকলেও তার যত্ন নেয়।

দাবি অস্বীকার: আমি পিএইচপি নেটিভ নই, তাই দয়া করে সাধারণ ভুল সহ্য করুন।

function xml2js($xmlnode) {
    $root = (func_num_args() > 1 ? false : true);
    $jsnode = array();

    if (!$root) {
        if (count($xmlnode->attributes()) > 0){
            $jsnode["$"] = array();
            foreach($xmlnode->attributes() as $key => $value)
                $jsnode["$"][$key] = (string)$value;
        }

        $textcontent = trim((string)$xmlnode);
        if (count($textcontent) > 0)
            $jsnode["_"] = $textcontent;

        foreach ($xmlnode->children() as $childxmlnode) {
            $childname = $childxmlnode->getName();
            if (!array_key_exists($childname, $jsnode))
                $jsnode[$childname] = array();
            array_push($jsnode[$childname], xml2js($childxmlnode, true));
        }
        return $jsnode;
    } else {
        $nodename = $xmlnode->getName();
        $jsnode[$nodename] = array();
        array_push($jsnode[$nodename], xml2js($xmlnode, true));
        return json_encode($jsnode);
    }
}   

ব্যবহারের উদাহরণ:

$xml = simplexml_load_file("myfile.xml");
echo xml2js($xml);

উদাহরণ ইনপুট (myfile.xML):

<family name="Johnson">
    <child name="John" age="5">
        <toy status="old">Trooper</toy>
        <toy status="old">Ultrablock</toy>
        <toy status="new">Bike</toy>
    </child>
</family>

উদাহরণ আউটপুট:

{"family":[{"$":{"name":"Johnson"},"child":[{"$":{"name":"John","age":"5"},"toy":[{"$":{"status":"old"},"_":"Trooper"},{"$":{"status":"old"},"_":"Ultrablock"},{"$":{"status":"new"},"_":"Bike"}]}]}]}

বেশিরভাগ মুদ্রিত:

{
    "family" : [{
            "$" : {
                "name" : "Johnson"
            },
            "child" : [{
                    "$" : {
                        "name" : "John",
                        "age" : "5"
                    },
                    "toy" : [{
                            "$" : {
                                "status" : "old"
                            },
                            "_" : "Trooper"
                        }, {
                            "$" : {
                                "status" : "old"
                            },
                            "_" : "Ultrablock"
                        }, {
                            "$" : {
                                "status" : "new"
                            },
                            "_" : "Bike"
                        }
                    ]
                }
            ]
        }
    ]
}

মনে রাখার জন্য প্রশ্ন: একই ট্যাগ নামের একাধিক ট্যাগ ভাই বোন হতে পারে। অন্যান্য সমাধানগুলি সম্ভবত শেষ ভাইবোন ছাড়া সমস্ত বাদ দেয়। এটি প্রতিটি এবং একক নোড এড়াতে, এমনকি এটির কেবল একটি শিশু থাকলেও একটি অ্যারে যা ট্যাগ-নেমের প্রতিটি উদাহরণের জন্য একটি অবজেক্ট রাখে। (উদাহরণস্বরূপ একাধিক "" উপাদান দেখুন)

এমনকি মূল উপাদানটি, যার মধ্যে একটি বৈধ এক্সএমএল ডকুমেন্টে কেবল একটির উপস্থিত থাকা উচিত উদাহরণস্বরূপ একটি অবজেক্টের সাথে অ্যারের হিসাবে সংরক্ষণ করা হয়, কেবলমাত্র একটি সামঞ্জস্যপূর্ণ ডেটা কাঠামো থাকতে পারে।

এক্সএমএল নোড সামগ্রী এবং এক্সএমএল বৈশিষ্ট্যের মধ্যে পার্থক্য জানাতে প্রতিটি বস্তুর বৈশিষ্ট্যগুলি "$" এবং "_" সন্তানের সামগ্রীতে সংরক্ষণ করা হয়।

সম্পাদনা: আমি আপনার উদাহরণ ইনপুট ডেটার জন্য আউটপুট দেখাতে ভুলে গেছি

{
    "states" : [{
            "state" : [{
                    "$" : {
                        "id" : "AL"
                    },
                    "name" : [{
                            "_" : "Alabama"
                        }
                    ]
                }, {
                    "$" : {
                        "id" : "AK"
                    },
                    "name" : [{
                            "_" : "Alaska"
                        }
                    ]
                }
            ]
        }
    ]
}

এটি কি বড় এক্সএমএল ডেটা পার্স করতে পারে?
ভোল্টিল 3

2
এই সমাধানটি আরও ভাল কারণ এক্সএমএল বৈশিষ্ট্যগুলি বাতিল করে না। Xml.com/lpt/a/1658 এ এই জটিল কাঠামোটি সরলীকৃতগুলির চেয়ে কেন ভাল, তাও দেখুন ("আধা-কাঠামোগত এক্সএমএল" দেখুন) .... অপ্স, সিডিএটিএর জন্য, যেমন @ টেক্সিওজি সিডিএটিএ উপাদানগুলি সমতল করার পরামর্শ দিয়েছিল $xml = simplexml_load_file("myfile.xml",'SimpleXMLElement',LIBXML_‌​NOCDATA);
পিটার ক্রাউস

একটি কাস্টম ফাংশন জন্য অনেক ধন্যবাদ! এটি টিউনিংকে বেশ সহজ করে তোলে। বিটিডব্লিউ, আপনার ফাংশনের একটি সম্পাদিত সংস্করণ যুক্ত করেছে যা এক্সএমএলকে জেএস উপায়ে পার্স করে: প্রতিটি প্রবেশের নিজস্ব অবজেক্ট থাকে (এন্ট্রিগুলিতে একটি করে অ্যারে সংরক্ষণ করা হয় না যদি তাদের সমান ট্যাগের নাম থাকে), যাতে অর্ডার সংরক্ষণ করা হয়।
লুসিফের 63

1
ত্রুটি Fatal error: Uncaught Error: Call to a member function getName() on bool.. আমি মনে করি একটি সংস্করণ পিএইচপি ব্যর্থ :-( .. দয়া করে সহায়তা হয়!
KingRider

10

একটি সাধারণ ক্ষতি হ'ল ভুলে যাওয়া যে json_encode()কোনও পাঠ্যমূল্য এবং বৈশিষ্ট্য (গুলি) সহ উপাদানগুলিকে সম্মান করে না । এটি সেইগুলির মধ্যে একটি বেছে নেবে, যার অর্থ ডেটালোস। নীচের ফাংশনটি সমস্যার সমাধান করে। যদি কেউ json_encode/ decodeপথে যাওয়ার সিদ্ধান্ত নেয় তবে নিম্নলিখিত ফাংশনটি পরামর্শ দেওয়া হয়।

function json_prepare_xml($domNode) {
  foreach($domNode->childNodes as $node) {
    if($node->hasChildNodes()) {
      json_prepare_xml($node);
    } else {
      if($domNode->hasAttributes() && strlen($domNode->nodeValue)){
         $domNode->setAttribute("nodeValue", $node->textContent);
         $node->nodeValue = "";
      }
    }
  }
}

$dom = new DOMDocument();
$dom->loadXML( file_get_contents($xmlfile) );
json_prepare_xml($dom);
$sxml = simplexml_load_string( $dom->saveXML() );
$json = json_decode( json_encode( $sxml ) );

এটি করে, আপনার জেএসএন-এর <foo bar="3">Lorem</foo>মতো শেষ হবে না {"foo":"Lorem"}


সংশ্লেষ-ত্রুটি সংশোধন করা হলে সংকলন করে না এবং বর্ণিত আউটপুট উত্পাদন করে না।
রিচার্ড কিফার

কী $dom? যে কোথা থেকে এসেছে?
জ্যাক উইলসন

om ডোম = নতুন ডোমডোকামেন্ট (); কোথা থেকে এসেছে
স্কট

1
কোডের শেষ লাইন: $ json = json_decode (json_encode ($ sxML))); হওয়া উচিত: $ json = json_decode (json_encode ($ sxML));
চার্লি স্মিথ

6

এটি ব্যবহার করার চেষ্টা করুন

$xml = ... // Xml file data

// first approach
$Json = json_encode(simplexml_load_string($xml));

---------------- OR -----------------------

// second approach
$Json = json_encode(simplexml_load_string($xml, "SimpleXMLElement", LIBXML_NOCDATA));

echo $Json;

অথবা

আপনি এই লাইব্রেরিটি ব্যবহার করতে পারেন: https://github.com/rentpost/xML2array


3

আমি এই উদ্দেশ্যে মাইলস জনসনের টাইপকোনভার্টার ব্যবহার করেছি । এটি সুরকার ব্যবহার করে ইনস্টলযোগ্য ।

আপনি এটি ব্যবহার করে এরকম কিছু লিখতে পারেন:

<?php
require 'vendor/autoload.php';
use mjohnson\utility\TypeConverter;

$xml = file_get_contents("file.xml");
$arr = TypeConverter::xmlToArray($xml, TypeConverter::XML_GROUP);
echo json_encode($arr);

3

আন্তোনিও সর্বাধিক উত্তর অনুকূলিতকরণ:

$xmlfile = 'yourfile.xml';
$xmlparser = xml_parser_create();

// open a file and read data
$fp = fopen($xmlfile, 'r');
//9999999 is the length which fread stops to read.
$xmldata = fread($fp, 9999999);

// converting to XML
$xml = simplexml_load_string($xmldata, "SimpleXMLElement", LIBXML_NOCDATA);

// converting to JSON
$json = json_encode($xml);
$array = json_decode($json,TRUE);

4
আমি এই পদ্ধতির ব্যবহার করেছি, তবে জেএসএন ফাঁকা। এক্সএমএল বৈধ।
ryabenko-প্রো

2

আপনি যদি এক্সএমএলটির নির্দিষ্ট অংশটিকে কেবল জেএসএনে রূপান্তর করতে চান তবে আপনি এটি পুনরুদ্ধার করতে এক্সপথ ব্যবহার করতে পারেন এবং এটিকে জেএসএনে রূপান্তর করতে পারেন।

<?php
$file = @file_get_contents($xml_File, FILE_TEXT);
$xml = new SimpleXMLElement($file);
$xml_Excerpt = @$xml->xpath('/states/state[@id="AL"]')[0]; // [0] gets the node
echo json_encode($xml_Excerpt);
?>

দয়া করে মনে রাখবেন যে আপনি যদি এক্সপথটি ভুল করে থাকেন তবে এটি একটি ত্রুটির সাথে মারা যাবে। সুতরাং আপনি যদি এজেএক্স কলগুলির মাধ্যমে এটি ডিবাগ করেন তবে আমি আপনাকে প্রস্তাবিত প্রতিক্রিয়াগুলিতেও লগ করার পরামর্শ দিচ্ছি।


2
This is better solution

$fileContents= file_get_contents("https://www.feedforall.com/sample.xml");
$fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents);
$fileContents = trim(str_replace('"', "'", $fileContents));
$simpleXml = simplexml_load_string($fileContents);
$json = json_encode($simpleXml);
$array = json_decode($json,TRUE);
return $array;

2

সেরা সমাধান যা একটি কবজির মতো কাজ করে

$fileContents= file_get_contents($url);

$fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents);

$fileContents = trim(str_replace('"', "'", $fileContents));

$simpleXml = simplexml_load_string($fileContents);

//$json = json_encode($simpleXml); // Remove // if you want to store the result in $json variable

echo '<pre>'.json_encode($simpleXml,JSON_PRETTY_PRINT).'</pre>';

উৎস


1

এটি আন্তোনিও ম্যাক্সের সর্বাধিক আপত্তিযুক্ত সমাধানের একটি উন্নতি, এটি এক্সএমএল এর সাথেও কাজ করে যা নাম স্পেস রয়েছে (কোলনটি আন্ডারস্কোর দিয়ে প্রতিস্থাপন করে)। এটিতে কিছু অতিরিক্ত বিকল্পও রয়েছে (এবং <person my-attribute='name'>John</person>সঠিকভাবে পার্স করতে পারে)।

function parse_xml_into_array($xml_string, $options = array()) {
    /*
    DESCRIPTION:
    - parse an XML string into an array
    INPUT:
    - $xml_string
    - $options : associative array with any of these keys:
        - 'flatten_cdata' : set to true to flatten CDATA elements
        - 'use_objects' : set to true to parse into objects instead of associative arrays
        - 'convert_booleans' : set to true to cast string values 'true' and 'false' into booleans
    OUTPUT:
    - associative array
    */

    // Remove namespaces by replacing ":" with "_"
    if (preg_match_all("|</([\\w\\-]+):([\\w\\-]+)>|", $xml_string, $matches, PREG_SET_ORDER)) {
        foreach ($matches as $match) {
            $xml_string = str_replace('<'. $match[1] .':'. $match[2], '<'. $match[1] .'_'. $match[2], $xml_string);
            $xml_string = str_replace('</'. $match[1] .':'. $match[2], '</'. $match[1] .'_'. $match[2], $xml_string);
        }
    }

    $output = json_decode(json_encode(@simplexml_load_string($xml_string, 'SimpleXMLElement', ($options['flatten_cdata'] ? LIBXML_NOCDATA : 0))), ($options['use_objects'] ? false : true));

    // Cast string values "true" and "false" to booleans
    if ($options['convert_booleans']) {
        $bool = function(&$item, $key) {
            if (in_array($item, array('true', 'TRUE', 'True'), true)) {
                $item = true;
            } elseif (in_array($item, array('false', 'FALSE', 'False'), true)) {
                $item = false;
            }
        };
        array_walk_recursive($output, $bool);
    }

    return $output;
}

2
এক্সএমএলকে পার্স করার জন্য কেউ রেগেক্স ব্যবহার করে না, যদি না এটি তুচ্ছ কাঠামো এবং খুব অনুমানযোগ্য ডেটা সহ সাধারণ এক্সএমএল থাকে। এই সমাধানটি কতটা খারাপ তা আমি যথেষ্ট চাপ দিতে পারি না। এটি BREAKS ডেটা। এটি অবিশ্বাস্যরূপে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ছড়িয়ে পড়ার বিষয়টি উল্লেখ করে বলবেন না যে আপনি অবিশ্বাস্যরূপে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে পড়েছেন (আপনি আবার রেজেক্সের সাথে পার্স করেন, এবং তারপরে আপনি আবার পার্স করেন?) এবং স্ব-সমাপনী ট্যাগগুলি পরিচালনা করেন না।
আলেকজান্ডার

আমি মনে করি না আপনি সত্যিই ফাংশনটি দেখেছেন। এটি রিজেক্সকে প্রকৃত বিশ্লেষণ করতে ব্যবহার করে না, কেবল নেমস্পেসগুলি মোকাবেলার জন্য একটি সহজ ফিক্স হিসাবে - যা আমার সমস্ত এক্সএমএল মামলার জন্য কাজ করে - এবং এটি "রাজনৈতিকভাবে সঠিক" না হয়ে কাজ করা সবচেয়ে গুরুত্বপূর্ণ। আপনি চাইলে এটি উন্নত করতে আপনাকে স্বাগতম!
TheStoryCoder

2
এটি যে আপনার পক্ষে কাজ করেছে তার অর্থ এই নয় যে এটি সঠিক। এটি এর মতো কোড যা বাগগুলি উত্পন্ন করে যা নির্ণয় করা অত্যন্ত শক্ত, এবং শোষণ উত্পন্ন করে। আমার অর্থ এই এমনকি w3schools.com/xML/xML_e উপাদান.asp এর মতো সাইটে এক্সএমএল স্পেকগুলিতে सतर्कভাবে তাকানো এই সমাধানটি কেন কাজ করবে না তার অনেক কারণ দেখায়। যেমনটি আমি বলেছিলাম, এটি স্বয়ং-সমাপ্তি ট্যাগগুলি সনাক্ত করতে <element/>ব্যর্থ হয়, যেমন XML- এ অনুমোদিত যা আন্ডারস্কোর সহ শুরু হয় এমন উপাদানগুলিকে সম্বোধন করতে ব্যর্থ হয় । সিডিএটিএ সনাক্ত করতে ব্যর্থ। এবং আমি যেমন বলেছি, এটি কম। অভ্যন্তরীণ পার্সিংয়ের কারণে এটি একটি ও (এন ^ 2) জটিলতা।
আলেকজান্ডার

1
জিনিসটি হ'ল এখানে নেমস্পেসগুলি নিয়ে কাজ করার কথা জিজ্ঞাসা করা হয়নি, এবং নামস্থানগুলি মোকাবেলার জন্য ভাল উপায় রয়েছে। নেমস্পেসগুলি একটি সহায়ক নির্মাণ হিসাবে উপস্থিত রয়েছে, এর মতো বিশ্লেষণ করার মতো নয় এবং এমন একটি জঘন্যতায় পরিণত হয়েছে যা কোনও যুক্তিসঙ্গত পার্সার দ্বারা প্রক্রিয়া করা হবে না। এবং এর জন্য আপনার যা যা করার দরকার তা হ'ল "২০১ slow সালের সবচেয়ে ধীর অ্যালগরিদম" এর পুরষ্কারের জন্য প্রতিযোগী তৈরি করা নয়, বরং কিছুটা অনুসন্ধান করা, আসল সমাধানগুলির একটি অগণিত নিয়ে আসা যেমন এই স্ট্যাকওভারফ্লো.com/ প্রশ্নগুলি / 16412047 /… এবং এটিকে উন্নতি বলার জন্য? কি দারুন.
আলেকজান্ডার

0

এখানে সমস্ত সমাধানের সমস্যা আছে!

... যখন প্রতিনিধিত্বটির নিখুঁত এক্সএমএল ব্যাখ্যার প্রয়োজন হয় (গুণাবলী নিয়ে সমস্যা ছাড়াই) এবং সমস্ত পাঠ্য-ট্যাগ-পাঠ্য-ট্যাগ-পাঠ্য -... এবং ট্যাগগুলির ক্রম পুনরুত্পাদন করার জন্য। এছাড়াও এখানে ভাল মনে রাখবেন যে JSON অবজেক্ট "একটি আনর্ডারড সেট" (কীগুলি পুনরাবৃত্তি করবে না এবং কীগুলি পূর্বনির্ধারিত ক্রম হতে পারে না) ... এমনকি জেডএফ এর এক্সএমএল 2 জসন ভুল (!) কারণ XML কাঠামোটি ঠিক সংরক্ষণ করে না।

এখানে সমস্ত সমাধানের এই সাধারণ এক্সএমএল নিয়ে সমস্যা রয়েছে,

    <states x-x='1'>
        <state y="123">Alabama</state>
        My name is <b>John</b> Doe
        <state>Alaska</state>
    </states>

... @ এফটিএভ সমাধানটি 3-লাইন সমাধানের চেয়ে ভাল বলে মনে হয়, তবে এই এক্সএমএল দিয়ে পরীক্ষা করার সময় খুব কম বাগও রয়েছে।

ওল্ড সলিউশন সেরা (ক্ষয়-উপস্থাপনের জন্য)

সমাধানটি, যা আজ জসনএমএল হিসাবে সুপরিচিত , জোর্বা প্রকল্প এবং অন্যরা ব্যবহার করে এবং প্রথমে ( ২০০ separately) স্টিফেন ম্যাকমে এবং জন স্নেলসন উপস্থাপন করেছিলেন

// the core algorithm is the XSLT of the "jsonML conventions"
// see  https://github.com/mckamey/jsonml
$xslt = 'https://raw.githubusercontent.com/mckamey/jsonml/master/jsonml.xslt';
$dom = new DOMDocument;
$dom->loadXML('
    <states x-x=\'1\'>
        <state y="123">Alabama</state>
        My name is <b>John</b> Doe
        <state>Alaska</state>
    </states>
');
if (!$dom) die("\nERROR!");
$xslDoc = new DOMDocument();
$xslDoc->load($xslt);
$proc = new XSLTProcessor();
$proc->importStylesheet($xslDoc);
echo $proc->transformToXML($dom);

উৎপাদন করা

["states",{"x-x":"1"},
    "\n\t    ",
    ["state",{"y":"123"},"Alabama"],
    "\n\t\tMy name is ",
    ["b","John"],
    " Doe\n\t    ",
    ["state","Alaska"],
    "\n\t"
]

দেখুন http://jsonML.org বা github.com/mckamey/jsonml । এই JSON এর উত্পাদনের বিধিগুলি JSON-analog উপাদানটির উপর ভিত্তি করে ,

এখানে চিত্র বর্ণনা লিখুন

এই সিনট্যাক্স একটি হল উপাদান সংজ্ঞা এবং পুনরাবৃত্তি সঙ্গে
element-list ::= element ',' element-list | element


2
খুব সন্দেহজনক এক্সএমএল কাঠামোতে আমি সন্দেহ করি যে আসল জীবন ব্যবহারের ঘটনা ঘটবে।
TheStoryCoder

0

উত্তরগুলি নিয়ে কিছুটা গবেষণা করার পরে, আমি এমন একটি সমাধান নিয়ে এসেছি যা ব্রাউজারগুলিতে আমার জাভাস্ক্রিপ্ট ফাংশনগুলির সাথে ঠিকঠাক কাজ করেছিল (কনসোল / দেব সরঞ্জাম সহ):

<?php

 // PHP Version 7.2.1 (Windows 10 x86)

 function json2xml( $domNode ) {
  foreach( $domNode -> childNodes as $node) {
   if ( $node -> hasChildNodes() ) { json2xml( $node ); }
   else {
    if ( $domNode -> hasAttributes() && strlen( $domNode -> nodeValue ) ) {
     $domNode -> setAttribute( "nodeValue", $node -> textContent );
     $node -> nodeValue = "";
    }
   }
  }
 }

 function jsonOut( $file ) {
  $dom = new DOMDocument();
  $dom -> loadXML( file_get_contents( $file ) );
  json2xml( $dom );
  header( 'Content-Type: application/json' );
  return str_replace( "@", "", json_encode( simplexml_load_string( $dom -> saveXML() ), JSON_PRETTY_PRINT ) );
 }

 $output = jsonOut( 'https://boxelizer.com/assets/a1e10642e9294f39/b6f30987f0b66103.xml' );

 echo( $output );

 /*
  Or simply 
  echo( jsonOut( 'https://boxelizer.com/assets/a1e10642e9294f39/b6f30987f0b66103.xml' ) );
 */

?>

এটি মূলত একটি নতুন ডোমডোকামেন্ট তৈরি করে, এতে লোড এবং এক্সএমএল ফাইল তৈরি করে এবং নোড এবং বাচ্চাদের প্রত্যেকটির মাধ্যমে ডেটা / পরামিতিগুলি পেয়ে এবং বিরক্তিকর "@" চিহ্ন ছাড়াই এটি জেএসএনে রফতানি করে।

এক্সএমএল ফাইলের লিঙ্ক


0

এই সমাধানটি নেমস্পেসগুলি, বৈশিষ্ট্যগুলি পরিচালনা করে এবং পুনরাবৃত্তিকারী উপাদানগুলির সাথে সামঞ্জস্যপূর্ণ ফলাফল উত্পন্ন করে (সর্বদা অ্যারেতে, এমনকি যদি কেবলমাত্র একটি ঘটনা থাকে)। র‌্যাফ্যাক্টরের sxiToArray () দ্বারা অনুপ্রাণিত ।

/**
 * <root><a>5</a><b>6</b><b>8</b></root> -> {"root":[{"a":["5"],"b":["6","8"]}]}
 * <root a="5"><b>6</b><b>8</b></root> -> {"root":[{"a":"5","b":["6","8"]}]}
 * <root xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy"><a>123</a><wsp:b>456</wsp:b></root> 
 *   -> {"root":[{"xmlns:wsp":"http://schemas.xmlsoap.org/ws/2004/09/policy","a":["123"],"wsp:b":["456"]}]}
 */
function domNodesToArray(array $tags, \DOMXPath $xpath)
{
    $tagNameToArr = [];
    foreach ($tags as $tag) {
        $tagData = [];
        $attrs = $tag->attributes ? iterator_to_array($tag->attributes) : [];
        $subTags = $tag->childNodes ? iterator_to_array($tag->childNodes) : [];
        foreach ($xpath->query('namespace::*', $tag) as $nsNode) {
            // the only way to get xmlns:*, see https://stackoverflow.com/a/2470433/2750743
            if ($tag->hasAttribute($nsNode->nodeName)) {
                $attrs[] = $nsNode;
            }
        }

        foreach ($attrs as $attr) {
            $tagData[$attr->nodeName] = $attr->nodeValue;
        }
        if (count($subTags) === 1 && $subTags[0] instanceof \DOMText) {
            $text = $subTags[0]->nodeValue;
        } elseif (count($subTags) === 0) {
            $text = '';
        } else {
            // ignore whitespace (and any other text if any) between nodes
            $isNotDomText = function($node){return !($node instanceof \DOMText);};
            $realNodes = array_filter($subTags, $isNotDomText);
            $subTagNameToArr = domNodesToArray($realNodes, $xpath);
            $tagData = array_merge($tagData, $subTagNameToArr);
            $text = null;
        }
        if (!is_null($text)) {
            if ($attrs) {
                if ($text) {
                    $tagData['_'] = $text;
                }
            } else {
                $tagData = $text;
            }
        }
        $keyName = $tag->nodeName;
        $tagNameToArr[$keyName][] = $tagData;
    }
    return $tagNameToArr;
}

function xmlToArr(string $xml)
{
    $doc = new \DOMDocument();
    $doc->loadXML($xml);
    $xpath = new \DOMXPath($doc);
    $tags = $doc->childNodes ? iterator_to_array($doc->childNodes) : [];
    return domNodesToArray($tags, $xpath);
}

উদাহরণ:

php > print(json_encode(xmlToArr('<root a="5"><b>6</b></root>')));
{"root":[{"a":"5","b":["6"]}]}

এটি আসলে মাল্টি-নেমস্পেসের ক্ষেত্রে কাজ করে, অন্যান্য সমাধানের চেয়ে ভাল, কেন ডাউন ভোট পেয়েছিল ...
এ্যারন

0

এটি খুব কাস্টমাইজ করার কারণে এফটিএভের উত্তরটি সবচেয়ে কার্যকর খুঁজে পেয়েছে তবে তার এক্সএমএল 2 জেএসের ফাংশনে কিছু ত্রুটি রয়েছে। উদাহরণস্বরূপ, যদি বাচ্চাদের উপাদানগুলির সমান ট্যাগ নাম থাকে তবে সেগুলি সমস্ত একক বস্তুতে সংরক্ষণ করা হবে, এর অর্থ এটি উপাদানগুলির ক্রম সংরক্ষণ করা হবে না। কিছু ক্ষেত্রে আমরা সত্যই অর্ডার সংরক্ষণ করতে চাই, তাই আমরা প্রতিটি উপাদানটির ডেটা আলাদা আলাদা বস্তুর মধ্যে আরও ভালভাবে সঞ্চয় করতে পারি:

function xml2js($xmlnode) {
    $jsnode = array();
    $nodename = $xmlnode->getName();
    $current_object = array();

    if (count($xmlnode->attributes()) > 0) {
        foreach($xmlnode->attributes() as $key => $value) {
            $current_object[$key] = (string)$value;
        }
    }

    $textcontent = trim((string)$xmlnode);
    if (strlen($textcontent) > 0) {
        $current_object["content"] = $textcontent;
    }

    if (count($xmlnode->children()) > 0) {
        $current_object['children'] = array();
        foreach ($xmlnode->children() as $childxmlnode) {
            $childname = $childxmlnode->getName();
            array_push($current_object['children'], xml2js($childxmlnode, true));
        }
    }

    $jsnode[ $nodename ] = $current_object;
    return $jsnode;
}

এটা যেভাবে কাজ করে। প্রাথমিক এক্সএমএল কাঠামো:

<some-tag some-attribute="value of some attribute">
  <another-tag>With text</another-tag>
  <surprise></surprise>
  <another-tag>The last one</another-tag>
</some-tag>

ফলাফল JSON:

{
    "some-tag": {
        "some-attribute": "value of some attribute",
        "children": [
            {
                "another-tag": {
                    "content": "With text"
                }
            },
            {
                "surprise": []
            },
            {
                "another-tag": {
                    "content": "The last one"
                }
            }
        ]
    }
}

-1

$state->nameভেরিয়েবলের একটি অ্যারে ধরে আছে বলে মনে হচ্ছে । তুমি ব্যবহার করতে পার

var_dump($state)

ভিতরে foreachযে পরীক্ষা।

যদি সেই ক্ষেত্রে, আপনি ভিতরে লাইন পরিবর্তন করতে পারেন foreachথেকে

$states[]= array('state' => array_shift($state->name)); 

এটি সংশোধন করতে।


দেখে মনে হচ্ছে বৈশিষ্ট্যগুলি অ্যারে তবে $ state-> নাম নয়
ব্রায়ান হ্যাডলক

-1
$templateData =  $_POST['data'];

// initializing or creating array
$template_info =  $templateData;

// creating object of SimpleXMLElement
$xml_template_info = new SimpleXMLElement("<?xml version=\"1.0\"?><template></template>");

// function call to convert array to xml
array_to_xml($template_info,$xml_template_info);

//saving generated xml file
 $xml_template_info->asXML(dirname(__FILE__)."/manifest.xml") ;

// function defination to convert array to xml
function array_to_xml($template_info, &$xml_template_info) {
    foreach($template_info as $key => $value) {
        if(is_array($value)) {
            if(!is_numeric($key)){
                $subnode = $xml_template_info->addChild($key);
                if(is_array($value)){
                    $cont = 0;
                    foreach(array_keys($value) as $k){
                        if(is_numeric($k)) $cont++;
                    }
                }

                if($cont>0){
                    for($i=0; $i < $cont; $i++){
                        $subnode = $xml_body_info->addChild($key);
                        array_to_xml($value[$i], $subnode);
                    }
                }else{
                    $subnode = $xml_body_info->addChild($key);
                    array_to_xml($value, $subnode);
                }
            }
            else{
                array_to_xml($value, $xml_template_info);
            }
        }
        else {
            $xml_template_info->addChild($key,$value);
        }
    }
}

এটি একটি ছোট এবং সার্বজনীন সমাধান যা ডেটা অ্যারের ভিত্তিতে জেএসএন রূপান্তরিত জসন_ডেকোড হতে পারে ... ভাগ্যবান
অক্টাভিও পেরেজ

2
কীভাবে এটি মূল প্রশ্নের উত্তর দেয়? আপনার উত্তরটি মূল প্রশ্নের চেয়ে আরও জটিল বলে মনে হচ্ছে, এবং এমনকি কোথাও জেএসওএন উল্লেখ করেছে বলে মনে হয় না।
ড্যান আর

-1

আপনি যদি উবুন্টু ব্যবহারকারী হন তবে এক্সএমএল রিডার ইনস্টল করুন (আমার কাছে পিএইচপি ৫..6 রয়েছে। আপনার কাছে অন্য থাকলে দয়া করে প্যাকেজটি সন্ধান করুন এবং ইনস্টল করুন)

sudo apt-get install php5.6-xml
service apache2 restart

$fileContents = file_get_contents('myDirPath/filename.xml');
$fileContents = str_replace(array("\n", "\r", "\t"), '', $fileContents);
$fileContents = trim(str_replace('"', "'", $fileContents));
$oldXml = $fileContents;
$simpleXml = simplexml_load_string($fileContents);
$json = json_encode($simpleXml);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.