Создание (XML) строки в цикле в Javascript - PullRequest
1 голос
/ 03 июня 2011

Я новичок в Javascript. У меня есть многомерный массив, который я хочу проанализировать, и выгрузить теги XML. Например, массив имеет тип

arr["fname1"][2] = param1 ; 

Я хочу вывести xml-теги, такие как -

<fname>fname1</fname>

Как только это будет сделано, моя последняя цель - отправить эту строку тегов xml с помощью jQuery.ajax (), например,

var xmlDocument = [create xml document];
$.ajax({
url: "page.php",
processData: false,
data: xmlDocument,
success: handleResponse
});

Как мне это сделать? Пожалуйста посоветуй. Спасибо!

Ответы [ 4 ]

2 голосов
/ 03 июня 2011

В зависимости от сложности вашего двумерного массива, самым простым будет цикл по нему и добавление в строку.Например,

function createXMLDocument(arr){
  var xmlDocument = "<myxmldoc>\n"

  for (node in arr) {
    var xmlNode = "\t<fname ";
    for (var i = 0; i < arr[node].length; i++){
      xmlNode += " attr" + i + "=\"" + arr[node][i] + "\" ";
    }
    xmlNode += ">" + node + "</fname>";
    xmlDocument += "\n" + xmlNode;
  }

  return xmlDocument + "\n</myxmldoc>";
}

Это даст вам что-то вроде

<myxmldoc>
  <fname attr0="param1" attr1="param2" ...>fname1</fname>
  <fname attr0="param1" attr1="param2" ...>fname2</fname>
  ...
</myxmldoc>

Если ваш массив должен сгенерировать более сложный документ / структуру XML, вы можете захотеть применить подход в соответствии с тем, чтоздесь описано:

http://oreilly.com/pub/h/2127

Надеюсь, это поможет.

1 голос
/ 03 июня 2011

Вы можете сделать это:

var xmlData = $('<data></data>');

Затем вы можете добавить любые данные, которые вам нравятся (те, которые вы хотите отправить), используя метод jquery:

xmlData.append("<myParentTag></myParentTag>");

другие свойства для обработки данных.Вы также можете использовать селекторы jquery для выбора определенных тегов и управления их содержимым.Затем вы можете отправлять данные следующим образом:

$.post(
    "/my_url/", 
    xmlData.html(), 
    function(msg) {/* On success perform actions */;}
);

Чтобы получить данные на стороне сервера, вы должны получить способ получения необработанной строки сообщения вместо использования словарной структуры.Используя Django, вы можете это сделать.

Я использовал этот подход в приложении, и он отлично работал.

0 голосов
/ 03 июня 2011

Я полагаю, что мне это может понадобиться позже, поэтому, чтобы ответить на ваш вопрос, я создал плагин jQuery, чтобы взять любой произвольный объект JavaScript и имя, которое вы хотели бы дать корневому узлу, и вернуть вам строку XML, представляющуюобъект.Плагин имеет встроенные комментарии:

(function($) {
    $.extend({
        /// <summary>
        /// Build an XML structure from an object.
        /// </summary>
        /// <param name="obj">The object to transform to an XML structure.</param>
        /// <param name="objName">The name of the XML node type.</param>
        /// <param name="parentObj">(optional) The parent node of the XML structure.</param>
        /// <returns>XML structure representing the object.</returns>
        toXml: function(obj, objName, parentObj) {

            // Use the supplied parent object or dimension a new root object
            var $parent = parentObj ? parentObj : $("<" + objName + "></" + objName + ">");

            // Determine if the object members do not have names
            var blank = obj instanceof Array ? "<item></item>" : null;

            // For each member of the object
            $.each(obj, function(i, val) {

                // Declare the next object with the appropriate naming convention
                var $next = $(blank ? blank : "<" + i + "></" + i + ">");

                // Add an index attribute to unnamed array members
                if (blank) $next.attr("index", i);

                if (typeof val === "object") {

                    // Recurse for object members
                    $next = $.toXml(val, i, $next);
                } else {

                    // Otherwise set the text for leaf nodes
                    $next.text(val);
                }

                // Append this child node
                $parent.append($next);
            });

            // Return the parent object with newly appended child nodes
            return $parent;
        },

        /// <summary>
        /// Build an XML string from an object.
        /// </summary>
        /// <param name="obj">The object to transform to an XML string.</param>
        /// <param name="rootName">The name of the root XML node type.</param>
        /// <returns>XML string representing the object.</returns>
        toXmlString: function(obj, rootName) {

            // Shell the XML object into a container and return its inner html
            return $("<container></container>").append($.toXml(obj, rootName)).html();
        }
    });
})(jQuery);

ИСПОЛЬЗОВАНИЕ

$.toXmlString(myObj, "myObjName");

См. рабочий пример здесь с использованием образца объекта JSON GeocodeResponse от GoogleКарты (так как он казался объектом достаточной сложности).

0 голосов
/ 03 июня 2011

Используя данную информацию, вы можете сделать следующее (хотя я бы предпочел отправлять данные как есть (JSON)).Это «оптимизированная» версия решения Colins (только один цикл, меньшее количество конкатенаций строк)

var arr = {
        "fname1": [1, 2, 3, 4], 
        "fname2": [1, 2, 3, 4],
        "fname3": [1, 2, 3, 4],
        "fname4": [1, 2, 3, 4]
    },
    xml = [],
    tag = null;


for (tag in arr) {
    if (arr.hasOwnProperty(tag) == false) {
        xml.push("<fname>" + tag + "</fname>");
        xml.push("<params><param>" + obj[tag].join("</param><param>") + "/param></params>");
    }
}

console.log(xml.join(""))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...