Beste Weg, um zu analysieren, HTML in Javascript
Ich bin eine Menge ärger lernen RegExp und kommen mit einem guten Algorithmus, um dies zu tun. Ich habe diesen HTML-string, muss ich noch analysieren. Beachten Sie, dass, wenn ich analysieren, ist es immer noch ein string-Objekt und nicht noch HTML an den browser, wie ich brauche, um zu analysieren, bevor es dort ankommt. Die HTML sieht wie folgt aus:
<html>
<head>
<title>Geoserver GetFeatureInfo output</title>
</head>
<style type="text/css">
table.featureInfo, table.featureInfo td, table.featureInfo th {
border:1px solid #ddd;
border-collapse:collapse;
margin:0;
padding:0;
font-size: 90%;
padding:.2em .1em;
}
table.featureInfo th {
padding:.2em .2em;
font-weight:bold;
background:#eee;
}
table.featureInfo td{
background:#fff;
}
table.featureInfo tr.odd td{
background:#eee;
}
table.featureInfo caption{
text-align:left;
font-size:100%;
font-weight:bold;
text-transform:uppercase;
padding:.2em .2em;
}
</style>
<body>
<table class="featureInfo2">
<tr>
<th class="dataLayer" colspan="5">Tibetan Villages</th>
</tr>
<!-- EOF Data Layer -->
<tr class="dataHeaders">
<th>ID</th>
<th>Latitude</th>
<th>Longitude</th>
<th>Place Name</th>
<th>English Translation</th>
</tr>
<!-- EOF Data Headers -->
<!-- Data -->
<tr>
<!-- Feature Info Data -->
<td>3394</td>
<td>29.1</td>
<td>93.15</td>
<td>བསྡམས་གྲོང་ཚོ།</td>
<td>Dam Drongtso </td>
</tr>
<!-- EOF Feature Info Data -->
<!-- End Data -->
</table>
<br/>
</body>
</html>
und ich brauche, um es zu bekommen wie diese:
3394,
29.1,
93.15,
བསྡམས་གྲོང་ཚོ།,
Dam Drongtso
Im Grunde ein array...noch besser wenn es passt nach seinem Feld Header und aus welcher Tabelle Sie sind irgendwie, die wie folgt Aussehen:
Tibetan Villages
ID
Latitude
Longitude
Place Name
English Translation
Finden sich JavaScript nicht unterstützt wunderbaren mapping war ein Mist und ich habe was ich will arbeiten bereits. Allerdings ist es sehr, SEHR hart codiert und ich denke, ich sollte wohl RegExp verwenden, um diese zu bewältigen besser. Leider habe ich eine echte harte Zeit :(. Hier ist meine Funktion zum analysieren von meiner saite (sehr hässlich IMO):
function parseHTML(html){
//Getting the layer name
alert(html);
//Lousy attempt at RegExp
var somestring = html.replace('/m//\<html\>+\<body\>//m/',' ');
alert(somestring);
var startPos = html.indexOf('<th class="dataLayer" colspan="5">');
var length = ('<th class="dataLayer" colspan="5">').length;
var endPos = html.indexOf('</th></tr><!-- EOF Data Layer -->');
var dataLayer = html.substring(startPos + length, endPos);
//Getting the data headers
startPos = html.indexOf('<tr class="dataHeaders">');
length = ('<tr class="dataHeaders">').length;
endPos = html.indexOf('</tr><!-- EOF Data Headers -->');
var newString = html.substring(startPos + length, endPos);
newString = newString.replace(/<th>/g, '');
newString = newString.substring(0, newString.lastIndexOf('</th>'));
var featureInfoHeaders = new Array();
featureInfoHeaders = newString.split('</th>');
//Getting the data
startPos = html.indexOf('<!-- Data -->');
length = ('<!-- Data -->').length;
endPos = html.indexOf('<!-- End Data -->');
newString = html.substring(startPos + length, endPos);
newString = newString.substring(0, newString.lastIndexOf('</tr><!-- EOF Feature Info Data -->'));
var featureInfoData = new Array();
featureInfoData = newString.split('</tr><!-- EOF Feature Info Data -->');
for(var s = 0; s < featureInfoData.length; s++){
startPos = featureInfoData[s].indexOf('<!-- Feature Info Data -->');
length = ('<!-- Feature Info Data -->').length;
endPos = featureInfoData[s].lastIndexOf('</td>');
featureInfoData[s] = featureInfoData[s].substring(startPos + length, endPos);
featureInfoData[s] = featureInfoData[s].replace(/<td>/g, '');
featureInfoData[s] = featureInfoData[s].split('</td>');
}//end for
alert(featureInfoData);
//Put all the feature info in one array
var featureInfo = new Array();
var len = featureInfoData.length;
for(var j = 0; j < len; j++){
featureInfo[j] = new Object();
featureInfo[j].id = featureInfoData[j][0];
featureInfo[j].latitude = featureInfoData[j][1];
featureInfo[j].longitude = featureInfoData[j][2];
featureInfo[j].placeName = featureInfoData[j][3];
featureInfo[j].translation = featureInfoData[j][4];
}//end for
//This can be ignored for now...
var string = redesignHTML(featureInfoHeaders, featureInfo);
return string;
}//end parseHTML
So wie Sie sehen können, wenn der Inhalt in diesem string überhaupt verändert, mein code wird schrecklich gebrochen. Ich möchte vermeiden, dass so viel wie möglich und versuchen, besseren code zu schreiben. Ich Schätze all die Hilfe und Ratschläge, die Sie mir geben können.
Parsen von HTML (oder XML) mit regex ist fast nie eine gute Idee.
stackoverflow.com/questions/1732348/...
Es gibt eine goldene Regel SO: NICHT PARSEN von HTML MIT REGULÄREN AUSDRÜCKEN
Ich wiederhole: stackoverflow.com/questions/1732348/... Wenn unsere Herzen sind rein, wir können stampfen, Regexp Parsen von HTML in unserem Leben! Oder Tony kommen wird.
InformationsquelleAutor elshae | 2010-11-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie jQuery leicht durchqueren den DOM und erstellen Sie ein Objekt mit der Struktur automatisch.
Den code können arbeiten mit mehreren Tabellen mit unterschiedlichen Strukturen im inneren.. und auch mehrere Daten-Zeilen in jeder Tabelle..
Den featureInfo halten wird die endgültige Struktur und Daten zugegriffen werden kann, wie
oder
mit jQuery könnte man einen
var dom = $(htmlstring);
und es uns als Rahmen, um den rest des Codes, indem Sie Sie starten als$('table:has(.dataLayer)', dom)
. Aktualisierung der Antwort..Wow, das ist wirklich genial und nett. Ich bin noch sehr neu in JavaScript, und es gibt eine Menge für mich zu lernen! Ich will durch diesen code und wenn ich es mit meiner app, ich werde es dich wissen lassen 🙂
nicht zu erwähnen, dass meine codes verwendet das jQuery framework.
Dass ich wusste, wie ich betaucht haben in jQuery ein bisschen, wie es zu sein scheint, die revolution von JavaScript :). Dein code funktioniert wunderbar und ich danke dir herzlich für das zeigen von mir, was verfügbar ist, die es gibt 🙂
InformationsquelleAutor Gabriele Petrioli
Führen Sie die folgenden Schritte:
documentFragment
Warum all die Analyse der Arbeit - das wird nicht funktionieren, egal wie, da wird ein HTML -nicht HIERFÜR gültigen via RegExp - wenn man die besten HTML-parser verfügbar ist? (der Browser)
InformationsquelleAutor Ivo Wetzel
Den "richtigen" Weg, es zu tun ist mit
DOMParser
. Machen Sie es wie diese:Oder, wenn Sie sind besorgt über browser-Kompatibilität, verwenden Sie die polyfill auf die MDN-Dokumentation:
Sorry, aber ich werde nicht Arbeit auf die erste IE9-Kompatibilität. Es wird benutzt, um weniger als 1% der Menschen, und die ist wirklich mehr ärger als es Wert ist.
warum haben Sie sich entschieden, zu verwenden HTMlHtmlElement rathe, als: var iframe= document.createElement("iframe"); iframe.innerHTML = markup; ?
Ich habe nicht schreiben den code in den zweiten Teil dieser Antwort, es ist von den Männern Dokumentation
InformationsquelleAutor markasoftware
Ändern Sie den serverseitigen code, wenn Sie können (hinzufügen, JSON)
Wenn du bist diejenige, die erzeugt den resultierenden HTML-Code auf der server-Seite könnte man auch generieren, ein JSON-es und pass es im HTML-Code mit dem Inhalt. Sie nicht haben, zu analysieren, alles auf der client-Seite und alle Daten sofort zur Verfügung, um Ihre client-Skripts.
Könnte man leicht JSON in
table
element alsdata
Attribut-Wert:Oder man könnte hinzufügen
data
Attribute auf die TDs, die Daten enthalten, und analysiert nur die Verwendung von jQuery-Selektoren und die Erstellung von Javascript-Objekt aus Ihnen heraus. Keine Notwendigkeit für RegExp Parsen.In anderen Worten, ich wollte mal Fragen, ob Sie Zugriff haben und die Fähigkeit/wissen zu ändern, server-side-code auf der Seite? Wenn Sie das tun, dann empfehle ich dir eigentlich schicken JSON mit der Seite selbst.
Daten hinzufügen von Attributen zu TDs Könnten Sie mir ein ganz einfaches Beispiel? Bedeutet das, dass
<td attr="latitude">92.34</td>
???Tut mir Leid, wenn meine Antwort nicht klar war. Theoretisch habe ich Zugang zu senden, JSON an meinem browser, aber da der server den ich verwende hat dieser Teil der Arbeit für mich, es kann gesagt werden, dass diese gekapselt ist von mir. In anderen Worten, die Menge der Mühe, die es dauern würde, gehen in den server und neu erfinden, die Art und Weise, es sendet diese Daten an den browser einfach nicht scheinen es mir Wert...
Ich denke, dass das hinzufügen einer zusätzlichen element-Attribut ist der Mühe Wert, weil Sie Daten auf die server in einem strukturierten Objekt Weg. Die Erzeugung JSON out-of-es ist viel einfacher, als Parsen von HTML. Was ist, wenn in einige Zeit erhalten Sie zum ändern der HTML selbst? Sie müssen re-entwickeln, die der parser als gut. Mit JSON in es nicht ändern, die client-seitige Funktionalität. Überprüfen Sie das Beispiel habe ich Hinzugefügt.
InformationsquelleAutor Robert Koritnik
Verwendung John Resig* Reine javascript-html-parser
Siehe demo hier
*John Resig ist der Schöpfer von jQuery
InformationsquelleAutor adardesign
Ich hatte eine ähnliche Anforderung und nicht der zu sein, der Erfahrung mit JavaScript-ich lasse jquery-handle für mich mit parseHTML und Verwendung finden. In meinem Fall war ich auf der Suche für divs mit einer bestimmten Klasse name.
InformationsquelleAutor kelceyp