使用javaScript解析子子XML节点

时间:2016-08-14 22:34:25

标签: javascript xml-parsing

我很难获得特定节点的价值。我使用以下代码从网址http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=25092882,25260646,25242549&retmode=xml中提取我的XML数据

function loadDoc() {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
    if (xhttp.readyState == 4 && xhttp.status == 200) {
        myFunction(xhttp);
    }
};
xhttp.open("GET",
    "http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=25092882,25260646,25242549&retmode=xml",
    true);
xhttp.send();}

function myFunction(xml) {
var txt = '';
var i;
var affiliation;
var aff;
var pmcid = '';
var xmlDoc = xml.responseXML;
var x = xmlDoc.getElementsByTagName("PubmedArticle");
var authors = "";
for (i = 0; i < x.length; i++) {
    var pmid = 'PMID: ' + x[i].getElementsByTagName("PMID")[0].childNodes[
        0].nodeValue;
    txt += pmid + "</br> ";
    var author = x[i].getElementsByTagName("Author");
    for (a = 0; a < author.length; a++) {
        authors += author[a].getElementsByTagName("LastName")[0].childNodes[
            0].nodeValue;
        authors += " ";
        authors += author[a].getElementsByTagName("Initials")[0].childNodes[
            0].nodeValue;
        affiliation = author[a].getElementsByTagName("AffiliationInfo")
        authors += " Author Affiliation: " + affiliation[0].getElementsByTagName(
            "Affiliation")[0].childNodes[0].nodeValue;
        authors += " " + "</br> ";
    }
    txt += authors + " ";
    var articleTitle = 'Article Title: ' + x[i].getElementsByTagName(
        "ArticleTitle")[0].childNodes[0].nodeValue;
    txt += articleTitle + "</br> ";
    var journal = 'Journal Title: ' + x[i].getElementsByTagName("Title")[
        0].childNodes[0].nodeValue;
    txt += journal + "</br> ";
    var yearPub = 'Date Published: ';
    txt += yearPub + "</br> "
    var AbstractText = 'Abstract Text: ' + x[i].getElementsByTagName(
        "AbstractText")[0].childNodes[0].nodeValue;
    txt += AbstractText + "</br> ";
    txt += "PMCID: " + pmcid + "</br> "
    txt += "</br> "
}
document.getElementById("demo").innerHTML += txt;

}

我遇到麻烦的是联盟。该值位于我循环的作者节点内,然后是AffiliationInfo然后是Affiliation。如果我取出Affiliation信息,该函数运行正常,但我需要获得Affiliation值。

提前致谢。

2 个答案:

答案 0 :(得分:1)

并非所有Author个节点都有Author Affiliation个节点。你需要检查是否存在。

   affiliation = author[a].getElementsByTagName("AffiliationInfo")
   if (affiliation.length > 0) {
       authors += " Author Affiliation: " + affiliation[0].getElementsByTagName("Affiliation")[0].childNodes[0].nodeValue;
       authors += " " + "</br> ";
    }

Month设置为变量并检查长度。

var pubMonth = [add code to get month]
if (pubMonth.length > 0) {
    '..Do stuff
}

如果您真的想认真对待XML解析,我建议使用XPath。为了获取节点值并遍历树,你需要编写很多额外的代码。

https://developer.mozilla.org/en/docs/Web/API/Document/evaluate

如果你不介意进入一个可以消除很多头痛的库,那么JQuery可以很好地完成它。

https://api.jquery.com/jQuery.parseXML/

答案 1 :(得分:0)

以下是JsJaxy(https://github.com/riversun/JsJaxy)的一个小例子。 解析XML(xml文档)并将其转换为JavaScript对象很容易。

String