2016-08-14 1 views
0

Ich habe Schwierigkeiten, den Wert für einen bestimmten Knoten zu ermitteln. Ich ziehe meine XML-Daten aus der URL http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=25092882,25260646,25242549&retmode=xml und ich bin mit dem folgenden CodeUntergeordnete Child-XML-Knoten mit Java-Script analysieren

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; 

}

Die Linie, die ich mit Mühe habe, ist die Zugehörigkeit. Der Wert befindet sich innerhalb des Autorenknotens, den ich wiederhole, und dann gibt es die AffiliationInfo und dann die Affiliation. Wenn ich die Affiliations-Informationen herausnehme, läuft die Funktion gut, aber ich muss die Affiliation-Werte erhalten.

Vielen Dank für die Zeit.

Antwort

1

Nicht alle Author Knoten haben Author Affiliation Knoten. Sie müssen auf Existenz prüfen.

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

Set Month auf eine Variable und prüfen, ob die Länge.

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

Wenn Sie wirklich mit XML-Analyse ernst erhalten wollte, würde ich vorschlagen, XPath verwenden. Es gibt eine Menge zusätzlichen Code, den Sie gerade schreiben, um Knotenwerte zu erhalten und den Baum zu durchlaufen.

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

Wenn Sie nichts dagegen haben, in eine Bibliothek bekommen, die Menge der Kopfschmerzen entfernt, tut JQuery es schön.

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

+0

Das funktioniert gut dort. Wie wäre es mit dem Monat im PubDate-Bereich. Ich kann das Jahr bekommen, aber nicht den Monat? v = x [i] .getElementsByTagName ("PubDate"); y + = v [0] .getElementsByTagName ("Jahr") [0] .childNodes [0] .nodeValue; Tut mir leid, ich weiß nicht, wie man einen Code-Block in den Kommentaren hinzufügen – user1314159

+0

Ich habe es, einige der PubDate Datensätze haben keinen Monat, so dass es nicht ausgeführt wird. Wenn ich nur Datensätze mit Jahren und Monaten verarbeite, funktioniert es gut. Wie prüfe ich, ob Monat existiert? – user1314159

+0

Danke - Ich habe alles, was ich brauche, jetzt muss ich an der Geschwindigkeit arbeiten. Ich würde gerne 100 Publikationen ziehen und dann sofort parsen. Ich werde den JavaScript-XML-Prozess als meine anfängliche Benchmark verwenden und jetzt jQuery ausprobieren und sehen, was schneller ist. Haben Sie Empfehlungen, was die schnellsten Ergebnisse bringt? – user1314159

0

Hier ist ein kleines Beispiel mit JsJaxy (https://github.com/riversun/JsJaxy). Es ist einfach, XML (XML-Dokument) zu analysieren und es in ein JavaScript-Objekt zu konvertieren.

var xmlParser = new org.riversun.jsjx.XmlParser(); 

var xhr = new XMLHttpRequest(); 
xmlParser.addArrayElementName('PubmedArticleSet.PubmedArticle'); 
xmlParser.addArrayElementName('PubmedArticleSet.PubmedArticle.CommentsCorrectionsList.CommentsCorrections'); 


xhr.open('GET', 'http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi?db=pubmed&id=25092882,25260646,25242549&retmode=xml', true); 
xhr.onreadystatechange = function() { 

    if (xhr.readyState == 4) { 

     if (xhr.status == 200) { 
      var doc = xhr.responseXML; 

      //do parse 
      var root = xmlParser.parseDocument(doc); 

      //show element 
      console.log(root.PubmedArticleSet.PubmedArticle[0].MedlineCitation.CommentsCorrectionsList.CommentsCorrections[0].RefSource); 
     } 
    } 

}; 
xhr.send(null); 
Verwandte Themen