0

I have the following example to get XML response from Ajax call and appending to table.

$("#ajaxform5").submit(function(e) {
    var formURL = $(this).attr("action");
    var request = $.ajax({
        url : formURL,
        type: "GET",
        contentType : "application/xml",
        headers: {
            "Type" : "events"
        },
        success: function(xml){
            $(xml).find('event').each(function(){
                var $event = $(this);
                var id = $event.find("id").text();
                var level = $event.find("level").text();
                var name = $event.find("name").text();
                var attributes01 = $event.find("attributes").children("entry").eq(0).children("string").eq(0).text();
                var attributes02 = $event.find("attributes").children("entry").eq(0).children("string").eq(1).text();
                var attributes11 = $event.find("attributes").children("entry").eq(1).children("string").eq(0).text();
                var attributes12 = $event.find("attributes").children("entry").eq(1).children("string").eq(1).text();
                var attributes21 = $event.find("attributes").children("entry").eq(2).children("string").eq(0).text();
                var attributes22 = $event.find("attributes").children("entry").eq(2).children("string").eq(1).text();
                var attributes31 = $event.find("attributes").children("entry").eq(3).children("string").eq(0).text();
                var attributes32 = $event.find("attributes").children("entry").eq(3).children("string").eq(1).text();
                var attributes41 = $event.find("attributes").children("entry").eq(4).children("string").eq(0).text();
                var attributes42 = $event.find("attributes").children("entry").eq(4).children("string").eq(1).text();
                var userId = $event.find("userId").text();
                var ipaddress = $event.find("ipaddress").text();
                var outcome = $event.find("outcome").text();
                var html = '<tr><td>' + id + '</td><td>' + level + '</td><td>' + name + '</td><td>' +
                    '<div><span class="title">' + attributes01 + '</span> <span>' + attributes02 + '</span></div>' +
                    '<div><span class="title">' + attributes11 + '</span> <span>' + attributes12 + '</span></div>' +
                    '<div><span class="title">' + attributes21 + '</span> <span>' + attributes22 + '</span></div>' +
                    '<div><span class="title">' + attributes31 + '</span> <span>' + attributes32 + '</span></div>' +
                    '<div><span class="title">' + attributes41 + '</span> <span>' + attributes42 + '</span></div>' +
                    '</td><td>' + userId + '</td><td>' + ipaddress + '</td><td>' + outcome + '</td></tr>';
                $('#eventTable').append(html);
            });
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
});

Now I want to use Datatables. So I convert response XML to JSON with xml2json(abdmob/x2js) and I got the JSON response below.

JSON response;

{
    "list" : {
        "event" : [{
                "dateTime" : "1473858435162",
                "nanoTime" : "438326047248251",
                "id" : "15680",
                "eventTime" : {
                    "time" : "1473851193487",
                    "timezone" : "Asia/Istanbul"
                },
                "level" : "INFORMATION",
                "name" : "Get message content",
                "attributes" : {
                    "entry" : [{
                            "string" : ["metaDataIds", "6"]
                        }, {
                            "string" : ["messageId", "2765"]
                        }, {
                            "string" : ["channel", "Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]"]
                        }
                    ],
                    "_class" : "linked-hash-map"
                },
                "outcome" : "SUCCESS",
                "userId" : "1",
                "ipAddress" : "127.0.0.1",
                "serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
            }, {
                "dateTime" : "1473858435167",
                "nanoTime" : "438326052034149",
                "id" : "15679",
                "eventTime" : {
                    "time" : "1473851191973",
                    "timezone" : "Asia/Istanbul"
                },
                "level" : "INFORMATION",
                "name" : "Get messages by page limit",
                "attributes" : {
                    "entry" : [{
                            "string" : ["filter", "MessageFilter[maxMessageId=2765,minMessageId=<null>,originalIdUpper=<null>,originalIdLower=<null>,importIdUpper=<null>,importIdLower=<null>,startDate=<null>,endDate=<null>,textSearch=<null>,textSearchRegex=<null>,statuses=<null>,includedMetaDataIds=[6],excludedMetaDataIds=<null>,serverId=<null>,contentSearch=[],metaDataSearch=<null>,textSearchMetaDataColumns=<null>,sendAttemptsLower=<null>,sendAttemptsUpper=<null>,attachment=false,error=false]"]
                        }, {
                            "string" : ["includeContent", "false"]
                        }, {
                            "string" : ["offset", "0"]
                        }, {
                            "string" : ["limit", "21"]
                        }, {
                            "string" : ["channel", "Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]"]
                        }
                    ],
                    "_class" : "linked-hash-map"
                },
                "outcome" : "SUCCESS",
                "userId" : "1",
                "ipAddress" : "127.0.0.1",
                "serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
            }
        ]
    }
}


So my first question, is this JSON response valid for DataTables?
If it is valid, how can I address objects and arrays to row / columns like in my first example?

I tried to insert JSON response to Datatables but I couldn't. You can see the result in the picture. response added to rows char by char

I gave the code below for illustration only, you do not want to know how much I drooled to insert data.
I also tried columns.data option to read arrays but failed again.

$("#ajaxform6").submit(function(e) {
    var formURL = $(this).attr("action");
    var request = $.ajax({
        url : formURL,
        type: "GET",
        contentType : "application/xml",
        headers: {
            "Type" : "events"
        },
        success: function(data, textStatus, jqXHR) {
            var x2js = new X2JS();
            var bXML = jqXHR.responseText;
            var jsonObj = x2js.xml_str2json(bXML);
            var json = JSON.stringify(jsonObj);
            console.log(json);
            $('#table_id').DataTable( {
                data: json,
                bSort: false,
            } );
        },
        error: function(jqXHR, textStatus, errorThrown) {
            alert(textStatus);
        }
    });
});

2 Answers 2

2

Your json data is received as response is valid and can be parsed to datatable.

You can refer following DataTable code which I have created using your json data :

var jsdata = {
		"list" : {
			"event" : [
					{
						"dateTime" : "1473858435162",
						"nanoTime" : "438326047248251",
						"id" : "15680",
						"eventTime" : {
							"time" : "1473851193487",
							"timezone" : "Asia/Istanbul"
						},
						"level" : "INFORMATION",
						"name" : "Get message content",
						"attributes" : {
							"entry" : [
									{
										"string" : [ "metaDataIds", "6" ]
									},
									{
										"string" : [ "messageId", "2765" ]
									},
									{
										"string" : [ "channel",
												"Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]" ]
									} ],
							"_class" : "linked-hash-map"
						},
						"outcome" : "SUCCESS",
						"userId" : "1",
						"ipAddress" : "127.0.0.1",
						"serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
					},
					{
						"dateTime" : "1473858435167",
						"nanoTime" : "438326052034149",
						"id" : "15679",
						"eventTime" : {
							"time" : "1473851191973",
							"timezone" : "Asia/Istanbul"
						},
						"level" : "INFORMATION",
						"name" : "Get messages by page limit",
						"attributes" : {
							"entry" : [
									{
										"string" : [
												"filter",
												"MessageFilter[maxMessageId=2765,minMessageId=<null>,originalIdUpper=<null>,originalIdLower=<null>,importIdUpper=<null>,importIdLower=<null>,startDate=<null>,endDate=<null>,textSearch=<null>,textSearchRegex=<null>,statuses=<null>,includedMetaDataIds=[6],excludedMetaDataIds=<null>,serverId=<null>,contentSearch=[],metaDataSearch=<null>,textSearchMetaDataColumns=<null>,sendAttemptsLower=<null>,sendAttemptsUpper=<null>,attachment=false,error=false]" ]
									},
									{
										"string" : [ "includeContent", "false" ]
									},
									{
										"string" : [ "offset", "0" ]
									},
									{
										"string" : [ "limit", "21" ]
									},
									{
										"string" : [ "channel",
												"Channel[id=44ab0667-d42c-496c-bca2-2bd7eecd6dc9,name=API jQuery Direct]" ]
									} ],
							"_class" : "linked-hash-map"
						},
						"outcome" : "SUCCESS",
						"userId" : "1",
						"ipAddress" : "127.0.0.1",
						"serverId" : "f85e48e2-32b3-429f-bee5-31630d8143a2"
					} ]
		}
	};

	$(document).ready(function() {
		$('#table_id').DataTable({
			data : jsdata.list.event,
			columns : [ {
				title : "Id",
				data : 'id'
			}, {
				title : "Level",
				data : 'level'
			}, {
				title : "Name",
				data : 'name'
			}, {
				title : "UserId",
				data : 'userId'
			}, {
				title : "Ip Address",
				data : 'ipAddress'
			}

			]
		});
	});
<link href="https://cdn.datatables.net/1.10.12/css/jquery.dataTables.min.css" rel="stylesheet"/>

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js"></script>

<script src="https://cdn.datatables.net/1.10.12/js/jquery.dataTables.min.js"></script>


<table id="table_id" class="display" width="100%"></table>

Sign up to request clarification or add additional context in comments.

3 Comments

Thanks for the help @abhijeet. One more thing, how can I add two data in one field? For example, I want show ID and Level in one field.
I updated my comment but you didn't get notification for this @Abhijeet. Do you have any idea how can I add two data in one field? For example, I want show "ID" and "Level" in one field.
@ObsessiO you can follow this link stackoverflow.com/questions/18081967/…
0
  • You don't need to use JSON.stringify
  • You need to specify data property for each column with columns.data property

Sample code for 2-column table is shown below. Add more column.data entries for additional columns.

$('#table_id').DataTable( {
   data: jsonObj.list.event,
   columns: [
      { data: 'name' },
      { data: 'level' }
   ]
});

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.