Создать XML в Javascript

Мне интересно, можно ли создать файл XML с некоторыми данными в Javascript? У меня есть данные, хранящиеся в переменных.

Я немного погуглил, и не похоже, что об этом много говорили. Я подумал, что мог бы использовать XMLWriter, например:

var XML = new XMLWriter();
XML.BeginNode ("testing");
XML.Node("testingOne");
XML.Node("TestingTwo");
XML.Node("TestingThree");
XML.EndNode();

как указано в этом руководстве: Учебное пособие по EHow

Однако, когда я выполняю этот код, я получаю следующую ошибку:

ReferenceError: XMLWriter is not defined

Любые идеи о том, как я могу начать с этого?

Заранее спасибо!


person BigBug    schedule 15.01.2013    source источник
comment
Я думаю, вы можете создать объект XML, манипулируя DOM обычными методами, а затем превратить его в строку с помощью innerHTML.   -  person Waleed Khan    schedule 15.01.2013
comment
См. flesler.blogspot.com/2008/03/xmlwriter-for-javascript. .html Это отдельный файл js, на который нужно ссылаться. Ты сделал это?   -  person OldProgrammer    schedule 15.01.2013
comment
Насколько я знаю, в ванильном JavaScript нет объекта XMLWriter. В статье, вероятно, объясняется, как использовать какую-то стороннюю библиотеку. Как бы то ни было, это странная статья — ее проблемы с форматированием наводят меня на мысль, что контент был взят с какого-то другого сайта, и там не указана ссылка на библиотеку.   -  person Álvaro González    schedule 15.01.2013
comment
@LeorA, нет, я этого не делаю, есть ли способ создать XML без использования какой-либо сторонней библиотеки?   -  person BigBug    schedule 15.01.2013
comment
@WaleedKhan: это не обязательно будет генерировать действительный XML (подумайте об элементах HTML без закрывающих тегов, специальных именах для символьных объектов и т. д.).   -  person PleaseStand    schedule 15.01.2013
comment
Даже если вы создаете xml-файл, его невозможно записать на диск с помощью JavaScript. Вы хотите, чтобы он отправил его на сервер? Какова цель, пожалуйста, укажите, и мы можем помочь вам лучше.   -  person srijan    schedule 15.01.2013
comment
@srijan прав. Вам нужно будет использовать какую-то библиотеку, зависящую от платформы, например, объект ActiveX для IE, не уверенный, что позволяет хром и т. Д., Но это будет зависеть от платформы.   -  person OldProgrammer    schedule 15.01.2013
comment
он будет отправлен в java-код в конце или что-то в этом роде, я не слишком уверен насчет всего процесса, его просто нужно создать в памяти   -  person BigBug    schedule 15.01.2013
comment
хорошо, я могу использовать ActiveXObject, я вижу, что он используется в другом месте в том же файле   -  person BigBug    schedule 15.01.2013
comment
Я считаю, что ActiveX работает только в Windows и только в IE.   -  person srijan    schedule 15.01.2013
comment
@srijan это хорошо, у вас есть быстрый пример, который я могу посмотреть, чтобы начать?   -  person BigBug    schedule 15.01.2013
comment
Я считаю ответ @ Seb3736 хорошим. Может быть, пришло время проверить как действительный какой-то ответ :)   -  person Alfonso Nishikawa    schedule 19.10.2017
comment
Исходная библиотека, на которую ссылается ваш код, находится здесь (дата 2005 г.), если вы хотите узнать или использовать ее: codeproject.com/Articles/12504/Writing-XML-using-JavaScript   -  person user3051040    schedule 12.04.2019


Ответы (7)


Отказ от ответственности. В следующем ответе предполагается, что вы используете среду JavaScript веб-браузера.

JavaScript обрабатывает XML с помощью «объектов XML DOM». Получить такой объект можно тремя способами:

<сильный>1. Создание нового объекта XML DOM

var xmlDoc = document.implementation.createDocument(null, "books");

Первый аргумент может содержать URI пространства имен создаваемого документа, если документ принадлежит одному из них.

Источник: https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument

<сильный>2. Получение XML-файла с помощью XMLHttpRequest

var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
if (xhttp.readyState == 4 && xhttp.status == 200) {

    var xmlDoc = xhttp.responseXML; //important to use responseXML here
}
xhttp.open("GET", "books.xml", true);
xhttp.send();

<сильный>3. Разбор строки, содержащей сериализованный XML

var xmlString = "<root></root>";
var parser = new DOMParser();
var xmlDoc = parser.parseFromString(xmlString, "text/xml"); //important to use "text/xml"

Когда вы получили объект XML DOM, вы можете использовать методы для управления им, например

var node = xmlDoc.createElement("heyHo");
var elements = xmlDoc.getElementsByTagName("root");
elements[0].appendChild(node);

Полную справку см. на странице http://www.w3schools.com/xml/dom_intro.asp

Примечание. Важно, чтобы вы не использовали методы, предоставляемые пространством имен документа, т.е. е.

var node = document.createElement("Item");

Это создаст узлы HTML вместо узлов XML и приведет к узлу с именами тегов в нижнем регистре. Имена тегов XML чувствительны к регистру, в отличие от имен тегов HTML.

Вы можете сериализовать объекты XML DOM следующим образом:

var serializer = new XMLSerializer();
var xmlString = serializer.serializeToString(xmlDoc);
person Seb3736    schedule 02.12.2015
comment
Я хотел сделать это в контексте TVJS, где у вас нет переменной document для извлечения document.implementation из. Вместо этого мне пришлось использовать DOMImplementationRegistry.getDOMImplementation(). - person Bruno De Fraine; 06.09.2016

Учтите, что нам нужно создать следующий XML-документ:

<?xml version="1.0"?>
<people>
  <person first-name="eric" middle-initial="H" last-name="jung">
    <address street="321 south st" city="denver" state="co" country="usa"/>
    <address street="123 main st" city="arlington" state="ma" country="usa"/>
  </person>

  <person first-name="jed" last-name="brown">
    <address street="321 north st" city="atlanta" state="ga" country="usa"/>
    <address street="123 west st" city="seattle" state="wa" country="usa"/>
    <address street="321 south avenue" city="denver" state="co" country="usa"/>
  </person>
</people>

мы можем написать следующий код для создания приведенного выше XML

var doc = document.implementation.createDocument("", "", null);
var peopleElem = doc.createElement("people");

var personElem1 = doc.createElement("person");
personElem1.setAttribute("first-name", "eric");
personElem1.setAttribute("middle-initial", "h");
personElem1.setAttribute("last-name", "jung");

var addressElem1 = doc.createElement("address");
addressElem1.setAttribute("street", "321 south st");
addressElem1.setAttribute("city", "denver");
addressElem1.setAttribute("state", "co");
addressElem1.setAttribute("country", "usa");
personElem1.appendChild(addressElem1);

var addressElem2 = doc.createElement("address");
addressElem2.setAttribute("street", "123 main st");
addressElem2.setAttribute("city", "arlington");
addressElem2.setAttribute("state", "ma");
addressElem2.setAttribute("country", "usa");
personElem1.appendChild(addressElem2);

var personElem2 = doc.createElement("person");
personElem2.setAttribute("first-name", "jed");
personElem2.setAttribute("last-name", "brown");

var addressElem3 = doc.createElement("address");
addressElem3.setAttribute("street", "321 north st");
addressElem3.setAttribute("city", "atlanta");
addressElem3.setAttribute("state", "ga");
addressElem3.setAttribute("country", "usa");
personElem2.appendChild(addressElem3);

var addressElem4 = doc.createElement("address");
addressElem4.setAttribute("street", "123 west st");
addressElem4.setAttribute("city", "seattle");
addressElem4.setAttribute("state", "wa");
addressElem4.setAttribute("country", "usa");
personElem2.appendChild(addressElem4);

var addressElem5 = doc.createElement("address");
addressElem5.setAttribute("street", "321 south avenue");
addressElem5.setAttribute("city", "denver");
addressElem5.setAttribute("state", "co");
addressElem5.setAttribute("country", "usa");
personElem2.appendChild(addressElem5);

peopleElem.appendChild(personElem1);
peopleElem.appendChild(personElem2);
doc.appendChild(peopleElem);

Если какой-либо текст должен быть написан между тегом, мы можем использовать свойство innerHTML для достижения этого.

Пример

elem = doc.createElement("Gender")
elem.innerHTML = "Male"
parent_elem.appendChild(elem)

Для получения более подробной информации перейдите по ссылке ниже. Приведенный выше пример был объяснен там более подробно.

https://developer.mozilla.org/en-US/docs/Web/API/Document_object_model/How_to_create_a_DOM_tree

person kkk    schedule 22.07.2018
comment
Хотя эта ссылка может ответить на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если связанная страница изменится. – Из обзора - person Luuklag; 22.07.2018
comment
@Luuklag Спасибо за комментарий. Я внес необходимые изменения в ответ - person kkk; 22.07.2018
comment
Документ Mozilla, похоже, содержит ошибку. В вашем втором примере кода последняя строка должна быть: doc.documentElement.appendChild(peopleElem) См. также ответ SO stackoverflow.com/a/41306899/1845672 - person Roland; 05.11.2018
comment
С вашим кодом будет легче работать, если вы поместите вызов appendChild сразу после вызова createElement. Затем вы все равно можете установить атрибуты и т. д. для нового элемента. - person Roland; 05.11.2018
comment
Показанный код не создаст верхнюю строку <?xml ... из показанного примера. Даже при вызове XMLSerializer.serializeToString() на doc. Вы можете добавить эту строку самостоятельно «вручную». - person Roland; 05.11.2018
comment
@ Роланд, ты прав, эту строку нужно добавить в код вручную. - person kkk; 13.11.2018
comment
Что насчет CDATA? Как это добавить? - person SpritsDracula; 27.07.2020

эта работа для меня..

var xml  = parser.parseFromString('<?xml version="1.0" encoding="utf-8"?><root></root>', "application/xml");

developer.mozilla.org/en-US/docs/Web/API/DOMParser

person elad gasner    schedule 14.01.2015

xml-writer(npm package) Я думаю, что это хороший способ создавать и писать xml файл легко. Также его можно использовать на стороне сервера с nodejs.

var XMLWriter = require('xml-writer');
xw = new XMLWriter;
xw.startDocument();
xw.startElement('root');
xw.writeAttribute('foo', 'value');
xw.text('Some content');
xw.endDocument();
console.log(xw.toString());
person qant    schedule 08.05.2019

Работает только в IE

 $(function(){

        var xml = '<?xml version="1.0"?><foo><bar>bar</bar></foo>'; 

        var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
        xmlDoc.async="false";
        xmlDoc.loadXML(xml);

        alert(xmlDoc.xml);

    });

Затем вставьте xmlDoc.xml в свой Java-код.

person srijan    schedule 15.01.2013
comment
есть ли способ для Firefox и Chrome - person ; 30.03.2018
comment
Работает только в IE --› не очень полезно в наши дни. - person Luke; 10.01.2019

Просто используйте

var xmlString = '<?xml version="1.0" ?><root />';
var xml = jQuery.parseXML(xml);

Это jQuery.parseXML, поэтому не нужно беспокоиться о кроссбраузерных трюках. Используйте jQuery как HTML, он использует собственный механизм XML.

person metadings    schedule 15.01.2013
comment
Обратите внимание, что во многих случаях попытка использовать jQuery для XML так же, как и для HTML, вызовет много головной боли. jQuery не справляется с XML, такие функции, как «replaceWith», «после», «до» работают только с узлами HTML, а не с узлами XML. (эти функции ожидают, что объект будет иметь свойство innerHTML) - person Drkawashima; 05.08.2014

Ваш код ссылается на эту библиотеку

Вы можете включить его, и тогда ваш рассматриваемый код должен работать как есть. Если вы хотите сделать это без добавления библиотеки и собрать ее только со встроенными функциями, следуйте ответу @Seb3736.

Пример в браузере

<html>
<head>
    <script src="Global.js" language="javascript"></script>
    <script src="XMLWriter.js" language="javascript"></script>
    <script language="javascript" type="text/javascript">
        function genXML(){
            var XML = new XMLWriter();
            XML.BeginNode ("testing");
            XML.Node("testingOne");
            XML.Node("TestingTwo");
            XML.Node("TestingThree");
            XML.EndNode();
            //Do something... eg.
            console.log(XML.ToString); //Yes ToString() not toString()
        }
    </script>
</head>
<body>
    <input type="submit" value="genXML" onclick="genXML();">
</body>
</html>

person user3051040    schedule 12.04.2019