51

是否可以在 JavaScript 中创建包含一些数据的 XML 文件?我将数据存储在变量中。

我用谷歌搜索了一下,似乎并没有谈论太多。我以为我可以XMLWriter这样使用:

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

如本教程所述:EHow教程

但是,当我执行此代码时,出现以下错误:

ReferenceError: XMLWriter 未定义

我该如何解决这个错误?

4

7 回答 7

89

免责声明:以下答案假定您使用的是 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);
于 2015-12-02T15:53:21.507 回答
20

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

于 2018-07-22T11:49:19.067 回答
5

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());
于 2019-05-08T19:59:41.293 回答
4

这项工作对我来说..

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

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

于 2015-01-14T06:53:21.070 回答
3

只需使用

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

它是jQuery.parseXML,因此无需担心跨浏览器技巧。像 HTML 一样使用 jQuery,它使用原生 XML 引擎。

于 2013-01-15T16:53:40.093 回答
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 代码。

于 2013-01-15T16:04:33.277 回答
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>

于 2019-04-12T03:10:39.397 回答