使用Javascript插入XML节点

时间:2011-12-14 20:21:16

标签: javascript xml

我似乎陷入了使用Javascript实现“XML数据插入”的困境。

我的应用程序是一个带有asp.net AJAX的asp.net。

我的XML文档如下:

<?xml version="1.0" encoding="utf-8" ?>
<hotels>
    <hotel supplier="Sarova panafric" id="HTL-10001">
        <supplier>Sarova panafric</supplier>
        <contact>Mr S Njoroge</contact>
        <tel>75-525254</tel>
    </hotel>
    <hotel supplier="Sarova mara" id="HTL-10002">
        <supplier>Sarova mara</supplier>
        <contact>Mr ole seni</contact>
        <tel>20-54574</tel>
    </hotel>
</hotels>

这是我用来尝试在我的XML文件中插入数据的JavaScript函数:

function addhotels() {
    var xml;
    if (window.ActiveXObject) {
        xml = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        xml = new XMLHttpRequest();
    }
    xml.open("GET", "hotelRates.xml", true);
    xml.send(null);

    var hotel = xml.responseXML.createElement("hotel");

    var supplier = xml.responseXML.createElement("supplier");
    supplier.appendChild(xml.responseXML.createTextNode("Sarova stanley"));

    var contact = xml.responseXML.createElement("contact");
    contact.appendChild(xml.responseXML.createTextNode("Mr Njoroge"));

    var tel = xml.responseXML.createElement("tel");
    tel.appendChild(xml.responseXML.createTextNode("21454741"));

    hotel.appendChild(supplier);
    hotel.appendChild(contact);
    hotel.appendChild(tel);
    xml.responseXML.appendChild(hotel);
}

XML文件位于我的项目的根文件夹中,页面位于该文件夹中。

我不知道为什么它不起作用。

============================== 我现在更改了代码如下,但仍无效果。

function addhotels() {
    var xml;
    if (window.ActiveXObject) {
        xml = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        xml = new XMLHttpRequest();
    }
    xml.open("GET", "hotelRates.xml", true);
    xml.send(null);

    var hotels = xml.responseXML.createElement("hotels");

    var supplier = xml.responseXML.createElement("supplier");
    supplier.appendChild(xml.responseXML.createTextNode("Sarova stanley"));

    var contact = xml.responseXML.createElement("contact");
    contact.appendChild(xml.responseXML.createTextNode("Mr Njoroge"));

    var tel = xml.responseXML.createElement("tel");
    tel.appendChild(xml.responseXML.createTextNode("21454741"));

    hotels.appendChild(supplier);
    hotels.appendChild(contact);
    hotels.appendChild(tel);
    xml.responseXML.appendChild(hotels); 
}

3 个答案:

答案 0 :(得分:2)

您当前正在调用send,然后希望响应立即可用。这根本就是错误的。 xml.opentrue)的第三个参数表示您希望异步执行请求。您需要在xml.onreadystatechange回调中处理响应:

function addhotels() {
    var xml;
    if (window.ActiveXObject) {
        xml = new ActiveXObject("Microsoft.XMLHTTP");
    } else {
        xml = new XMLHttpRequest();
    }
    xml.onreadystatechange = function() {
        if (xml.readyState == 4 && xml.status == 200) {
            var resp = xml.responseXML;
            var hotel = xml.responseXML.createElement("hotel");

            var supplier = xml.responseXML.createElement("supplier");
            supplier.appendChild(xml.responseXML
                    .createTextNode("Sarova stanley"));

            var contact = xml.responseXML.createElement("contact");
            contact.appendChild(xml.responseXML.createTextNode("Mr Njoroge"));

            var tel = xml.responseXML.createElement("tel");
            tel.appendChild(xml.responseXML.createTextNode("21454741"));

            hotel.appendChild(supplier);
            hotel.appendChild(contact);
            hotel.appendChild(tel);
            xml.responseXML.documentElement.appendChild(hotel);
        }
    }
    xml.open("GET", "hotelRates.xml", true);
    xml.send(null);
}

请注意,我也将xml.responseXML.appendChild更改为xml.responseXML.documentElement.appendChild,正如@ Dr.Molle所指出的那样。您无法附加到文档本身。

答案 1 :(得分:1)

尝试

xml.responseXML.documentElement.appendChild(hotel);

目前您将节点附加到文档,什么是非法操作,因为XML文档可能只有1个根元素。
xml.responseXML.documentElement指向根元素(<hotels/>

答案 2 :(得分:0)

我会说你没有保存所做的更改。您需要将其保存到XML文件。您可以先将响应XML作为变量xmldoc,然后将新数据添加到其中,最后写入-xmldoc.save(“hotelrates.xml”);