在JavaScript中创建XML

59

在JavaScript中可以创建带有某些数据的XML文件吗?我已将数据存储在变量中。

我已经在谷歌上搜索了一下,似乎并没有太多讨论。我认为我可以使用XMLWriter来实现,如下所示:

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

正如这个教程所述:EHow 教程

然而,当我执行这段代码时,我得到了以下错误:

引用错误:XMLWriter未定义

我该如何解决这个错误?


2
我认为您可以通过使用通常的方法操作DOM来创建XML对象,然后使用innerHTML将其转换为字符串。 - Waleed Khan
1
请参见http://flesler.blogspot.com/2008/03/xmlwriter-for-javascript.html。这是一个单独的JS文件,您需要引用它。您已经这样做了吗? - OldProgrammer
1
据我所知,在原生JavaScript中没有XMLWriter对象。该文章可能解释了如何使用一些第三方库。不管怎样,这是一篇奇怪的文章——它的格式问题让我觉得内容是从其他网站抓取的,并且省略了库的链接。 - Álvaro González
@srijan 没问题,你有一个快速的例子可以让我开始吗? - BigBug
1
我认为@Seb3736的回答很好。也许现在是时候将某些答案标记为有效了 :) - Alfonso Nishikawa
显示剩余8条评论
7个回答

101

免责声明:以下回答假定您正在使用Web浏览器的JavaScript环境。

JavaScript使用'XML DOM对象'处理XML。您可以通过以下三种方式获取这样的对象:

1. 创建一个新的XML DOM对象

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

如果文档属于某个命名空间,第一个参数可以包含要创建的文档的命名空间URI。

来源:https://developer.mozilla.org/en-US/docs/Web/API/DOMImplementation/createDocument

2. 使用XMLHttpRequest获取XML文件

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节点,并生成一个带有小写标签名称的节点。与HTML标签名称不同,XML标签名称区分大小写。

您可以像这样序列化XML DOM对象:

var serializer = new XMLSerializer();
var xmlString = serializer.serializeToString(xmlDoc);

我正在寻找在TVJS环境下完成此操作的方法,其中您没有document变量来检索document.implementation。相反,我必须使用DOMImplementationRegistry.getDOMImplementation() - Bruno De Fraine

30

请考虑我们需要创建以下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

我们可以编写以下代码来生成上述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


这节省了我很多时间。谢谢。 - Marcin Żmigrodzki

9

xml-writer(npm包) 我认为这是创建和编写xml文件的好方法,而且可以在后端使用node.js。

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());

3

3

只需简单使用

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

这里使用的是jQuery.parseXML,因此无需担心跨浏览器技巧。与HTML一样使用jQuery,它使用本地XML引擎。


3
请注意,在许多情况下,试图像处理HTML一样使用jQuery处理XML会引起很多麻烦。jQuery在处理XML时表现不佳,如'replaceWith'、'after'、'before'等函数仅适用于HTML节点,而非XML节点。(这些函数需要对象具备'innerHTML'属性) - Drkawashima

2

仅在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代码中。

有没有任何方法可以在Firefox和Chrome中实现? - user7760904

0

你的代码正在引用 这个库

你可以将其包含进来,然后你的代码就应该可以正常运行。如果你想不依赖这个库并且只使用内置函数来实现同样的功能 - 可以参考@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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接