【问题标题】:XML Parsing with Javascript使用 Javascript 进行 XML 解析
【发布时间】:2023-03-07 17:56:02
【问题描述】:

我有一个包含多条记录的 XML 文件,我想在一个页面上显示所有这些记录。我已经写了一些代码,但它并没有帮助我。 这里有些标签是可选的,所以我如何在没有出现的可选标签中显示“--”?

XML 文件

<doctors>
    <doctor specialization="Gynaecologist">
        <name>Alex Mashkin</name>
        <bachelor_degree>MBBS</bachelor_degree>
        <master_degree>Master in Gynaecology</master_degree>
        <experience>7 Years</experience>
        <available_timings>12PM to 5PM</available_timings>
        <fees>500</fees>
        <operation_charges>20000</operation_charges>
        <special_visit_charges>1000</special_visit_charges>
    </doctor>
    <doctor specialization="Sergeon">
        <name>Dazy Deepy</name>
        <bachelor_degree>MBBS</bachelor_degree>
        <master_degree>Master in Surgery</master_degree>
        <experience>10 Years</experience>
        <available_timings>11AM to 2PM</available_timings>
        <fees>900</fees>
        <operation_charges>25000</operation_charges>
        <special_visit_charges>1800</special_visit_charges>
    </doctor>
    <doctor specialization="Dentist">
        <name>Mona Bralia</name>
        <bachelor_degree>BDS</bachelor_degree>
        <experience>3 Years</experience>
        <available_timings>4PM to 8PM</available_timings>
        <fees>300</fees>
        <special_visit_charges> 600</special_visit_charges>
    </doctor> </doctors>

HTML 代码

(sn-p)

<script type="text/javascript">
    if (window.XMLHttpRequest) {
        //Code for IE7,Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    } else {
        //code for IE6,IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.open("GET", "XMLFile.xml", false);
    xmlhttp.send();
    xmlDoc = xmlhttp.responseXML;

    document.write("<table border='1'>");
    var x=xmlDoc.getElementsByTagName("doctor");
    for (i=0;i<x.length;i++)
      { 
      document.write("<tr><td>");
      document.write(x[i].getElementsByTagName("name")[0].childNodes[0].nodeValue);
      document.write("</td><td>");
      document.write(x[i].getAttribute("specialization"));
      document.write("</td><td>");
      document.write(x[i].getElementsByTagName("bachelor_degree")[0].childNodes[0].nodeValue);
      document.write("</td><td>");
      document.write(x[i].getElementsByTagName("master_degree")[0].childNodes[0].nodeValue);
      document.write("</td><td>");
      document.write(x[i].getElementsByTagName("experience")[0].childNodes[0].nodeValue);
      document.write("</td><td>");
      document.write(x[i].getElementsByTagName("available_timings")[0].childNodes[0].nodeValue);
      document.write("</td><td>");
      document.write(x[i].getElementsByTagName("fees")[0].childNodes[0].nodeValue);
      document.write("</td><td>");
      document.write(x[i].getElementsByTagName("operation_charges")[0].childNodes[0].nodeValue);
      document.write("</td><td>");
      document.write(x[i].getElementsByTagName("special_visit_charges")[0].childNodes[0].nodeValue);
      document.write("</td></tr>");
      }
    document.write("</table>");

</script>

【问题讨论】:

  • “无法正常工作”具体是什么意思?完全无法运行?你的 JS 控制台有错误吗?
  • 实际上它没有显示正确的输出。我想只向一些医生展示硕士学位,如果没有得到一个,它应该给出一些“---”符号来说明医生没有完成硕士学位......
  • 如果您删除了所有与您显示硕士学位问题无关的代码,我们将更容易为您提供帮助,实际上它可能会导致您看到解决方案为自己。

标签: javascript xml-parsing


【解决方案1】:

因此,您想要迭代所有 &lt;doctor&gt; 元素,并检查每个元素的子元素。这意味着您不能只从文档中获取所有xmlDoc.getElementsByTagName("master_degree") 并认为它的ith 项将匹配当前医生,因为有些医生没有&lt;master_degree&gt; 元素。相反,通过在医生本身上应用getElementsByTagName 来检查每个人,并计算您选择了多少个硕士学位(可能没有,可能不止一个?)。

// a mapping from HTML ids to XML tag names, to make it more programmatical
var map = {dname:"name", bdegree":"bachelor_degree", mdegree:"master_degree", exp:"experience", availibity:"available_timings, fee:"fees", opcharge:"operation_charges", spcharge:"special_visit_charges"};
// and from HTML ids to XML attribute names of the doctor
var attrmap = {spec:"specialisation"};

… // load XML etc - you should do it asynchronous, btw
var doctors = xmlDoc.getElementsByTagName("doctor"),
    doctorCount = doctors.length;
for (var i=0; i<doctorCount; i++) {
    var doc = doctors[i];
    for (var id in map) {
        var elements = doc.getElementsByTagName(map[id]),
            var result = "";
        if (!elements.length)
            result = "---";
        for (var j=0; j<elements.length; j++)
            if (elements[i].firstChild)
                result += elements[i].firstChild.data;
        document.getElementById(id).innerText += result;
    }
    for (var id in attrmap) {
        document.getElementById(id).innerText += doc.getAttribute(attrmap[id]);
    }
}

【讨论】:

  • 我试过 "if(document.write(x[i].getElementsByTagName("master_degree").length>0))" 但我得到了一些奇怪的输出。它向我展示的是真假而不是硕士学位。
  • 不要使用document.write,顺便说一句。你的输出有什么奇怪的?你写下你的x[i]中是否有多个master_degree元素的布尔结果
  • 我写 if(document.write(x[i].getElementsByTagName("master_degree").length>0)) { document.write(x[i].getElementsByTagName("master_degree")[ 0].childNodes[0].nodeValue);这里有什么问题..???为什么不写document.write?那有什么问题?
  • 为什么要写两次x[i].getElementsByTagName("master_degree")?否则它对我来说看起来不错,你会得到什么错误?
  • 嘿,我尝试了你的代码,但它根本不起作用......我没有看到任何输出。
【解决方案2】:

经过大量研究,我找到了用属性迭代所有元素的最短方法。 代码如下:

<script type="text/javascript">
if (window.XMLHttpRequest)
{
    //Code for IE7,Firefox, Chrome, Opera, Safari
    xmlhttp = new XMLHttpRequest();
}
else
{
    //code for IE6,IE5
    xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
xmlhttp.open("GET", "XMLFile.xml", false);
xmlhttp.send();
xmlDoc = xmlhttp.responseXML;
y=xmlDoc.documentElement.childNodes;
for (i=0;i<y.length;i++)
{
    if (y[i].nodeType!=3)
    {
        //This code for printing attribute of a tag(you have to give attribute name).
        document.write("<br>" + y[i].getAttributeNode('specialization').nodeName + ":  ");
        document.write(y[i].getAttributeNode('specialization').nodeValue + "<br>");
        for (z=0;z<y[i].childNodes.length;z++)
        {
            if (y[i].childNodes[z].nodeType!=3)
            {
                            //This is for Node Name.
                document.write(y[i].childNodes[z].nodeName + ": ");
                            //This is for Node Value.
                document.write(y[i].childNodes[z].textContent + "<br>");
            }
        }
    }
}
</script>

【讨论】:

    猜你喜欢
    • 2013-03-29
    • 2013-07-18
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 2013-06-25
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多