xml childNodes计数因浏览器而异

时间:2011-12-10 04:39:31

标签: javascript xml dom

我有一个javascript函数,我尝试读取XML文件。

function readXML()
{
    alert("readXML");
    if(xmlDoc.readyState == 4 || xmlDoc.readyState == 'complete')
    {
        for(var i=0; i < xmlDoc.getElementsByTagName("Question").length; i++)
        {
            var CurrentTuple = xmlDoc.getElementsByTagName("Question")[i];
            var QuestionID = CurrentTuple.attributes.getNamedItem("QuestionID").value;
            var CorrectAnswer = CurrentTuple.attributes.getNamedItem("CorrectAnswer").value;

            alert(QuestionID +":"+ CorrectAnswer);

            var OutputDisplayString = "";
            for(var j=0; j< CurrentTuple.childNodes.length; j++)
            {
                //alert(CurrentTuple.childNodes[j].nodeName);
                OutputDisplayString += CurrentTuple.childNodes[j].nodeName;
                OutputDisplayString += "\n";
            }
            alert(OutputDisplayString);
        }
    }
}

对于XML文件...

<?xml version="1.0" encoding="ISO-8859-1"?>
<Exam>
   <Question QuestionID="Q001" CorrectAnswer="A">   
       <Description>Does a final member variable have to be initialized at the time it's  declared?</Description>
       <AnswerA>No</AnswerA>
       <AnswerB>Yes</AnswerB>
       <AnswerC></AnswerC>
       <AnswerD></AnswerD>
   </Question> 
</Exam>

然后,请让我显示“alert(OutputDisplayString);”的输出结果。使用Firefox。

#text
Description
#text
AnswerA
#text
AnswerB
#text
AnswerC
#text
AnswerD
#text

让我比较一下使用IE得到的结果。

---------------------------
Message from webpage
---------------------------
Description
AnswerA
AnswerB
AnswerC
AnswerD

---------------------------
OK   
---------------------------

那么我想知道的是什么是 #text 我从Firefox得到的结果。
然后通过获取 #text 结果,我无法评估“CurrentTuple.childNodes.length”childNotes的确切计数。

请让我知道Firefox发生了 #text 的结果 我怎样才能得到正确的childNotes数量。

1 个答案:

答案 0 :(得分:1)

Firefox将白色空格和换行符计为XML节点,而IE则不计算。如果你写

<AnswerA>No</AnswerA><AnswerB>Yes</AnswerB>

在XML文档的同一行,你应该找不到AnswerA和AnswerB之间的文本节点。 我会手动过滤掉文本节点,因为它们是这样迭代的:

if (CurrentTuple.childNodes[j].nodeName == "#text") ...

或者更喜欢这样:

if ("tagName" in CurrentTuple.childNodes[j]) ...

我能想到的其他方法不适用于旧浏览器。