XML文档;“未定义”;在JavaScript中

XML文档;“未定义”;在JavaScript中,javascript,xml,html,Javascript,Xml,Html,我正在用HTML5实现一个我正在玩的游戏理念。当然,其中的一部分是存储内容,其中包括游戏中不同能力的数据以及角色等 虽然动态内容(如特定字符)将在以后移动,但我可能会坚持使用XML来处理静态内容,如能力和装备的统计数据,这意味着我更愿意尽快解决XML的问题 现在,为了做到这一点,我在战斗阶段的开始加载XML文档,首先是角色,然后是与角色相关的能力等 为此,我有一个“loadXMLFile”函数,它采用一个文件名: var loadXMLFile = function(filename) {

我正在用HTML5实现一个我正在玩的游戏理念。当然,其中的一部分是存储内容,其中包括游戏中不同能力的数据以及角色等

虽然动态内容(如特定字符)将在以后移动,但我可能会坚持使用XML来处理静态内容,如能力和装备的统计数据,这意味着我更愿意尽快解决XML的问题

现在,为了做到这一点,我在战斗阶段的开始加载XML文档,首先是角色,然后是与角色相关的能力等

为此,我有一个“loadXMLFile”函数,它采用一个文件名:

var loadXMLFile = function(filename) {
  req = new XMLHttpRequest();
  req.onreadystatechange = function() {
    return req.responseXML;
  }
  req.open("GET", filename, true);
  req.send();
}
加载和操作数据的示例如下:

function Character(id) {
  doc = loadXMLFile("characters.xml");
  characters = doc.getElementsByTagName("Character");
我这样做的目的是让函数调用在继续之前等待返回值。从问题的标题可以看出,这是行不通的。相反,只要我尝试操作数据,即示例中的第三行,我就会收到以下运行时错误:UncaughtTypeError:无法调用undefined的方法'getElementsByTagName'


如示例所示,我在构造函数中加载这些XML文件,使用XML文件填充类。因此,在readystatechange事件处理程序中调用不同函数的结构并不可取。我是否被迫在任何地方重复XML加载代码,只是为了创建单独的事件处理程序?

我建议使用jQuery或其他javascript框架。处理这样的问题要容易得多,您将节省大量时间和代码行。另一个问题是代码中没有给出的跨浏览器兼容性。

要更改:

req.open("GET", filename, true);
致:

发出同步请求(这意味着在继续之前等待请求)

您不能从onreadystatechange返回某些内容,这部分代码是错误的

你没有检查函数的实际状态,所以这也是错误的

所以基本上你的代码是不正确的。我建议为XMLHttpRequest找到一个教程站点并复制它们的代码

作为旁注,你为什么让自己的生活变得艰难?安装jQuery并让它为您完成所有这些工作


最后一点要注意的是,json比xml更容易使用,您可能希望切换到这一点。

前面提到的代码是特定于浏览器的问题。理想情况下,您应该使用跨浏览器兼容的基于javascript的框架。您可以避免大多数与跨浏览器相关的问题

为了解决您的问题,getElementsByTagName函数在doc元素中不可用。因此,您可以按以下方式修改代码

if(doc.getElementsByTagName){
     characters = doc.getElementsByTagName("Character");
}
但这只会避免错误,但不会解决获取Character元素的问题

最好的选择是在服务器中将XML转换为JSON,并将JSON发送到客户端。很容易遍历JSON,并且不存在跨浏览器问题

我们可以很容易地遍历JSON,如下所示:

function traverseJSON (jsonObj){
    for(var value in jsonObj){
        if(typeof value == 'function'){//this is to avoid 'remove' function in case of Array, Array object will be available in case of repeating elements in XML. 
            continue;
        }else if(typeof value == 'object'){ //refers to element in XML 
            traverseJSON(value);
        }else if(typeof value== 'string'){   //refers to attribute in XML
        jsonObj[value]; //refers to the attribute value in XML
        }
    }
}

上面的函数可以用来遍历JSON,JSON以JSON对象作为输入。

对于真/假,这里的代码实际上是错误的,我在自己的代码中使用了false。事实证明,我应该仔细阅读XML和JS的示例为什么会这样做。我已经将返回值移动到send()之后,现在我得到了一个类似的错误,但是doc变量不是“undefined”,而是“null”。尽管jQuery似乎也是公司想要的东西,但它与实际构建游戏一样,也是一种学习体验。
function traverseJSON (jsonObj){
    for(var value in jsonObj){
        if(typeof value == 'function'){//this is to avoid 'remove' function in case of Array, Array object will be available in case of repeating elements in XML. 
            continue;
        }else if(typeof value == 'object'){ //refers to element in XML 
            traverseJSON(value);
        }else if(typeof value== 'string'){   //refers to attribute in XML
        jsonObj[value]; //refers to the attribute value in XML
        }
    }
}