Ich bin neu in jQuery und möchte ein XML-Dokument analysieren.
Ich kann reguläres XML mit den Standard-Namespaces analysieren, aber mit XML wie:
<xml xmlns:s="uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882" xmlns:dt="uuid:C2F41010-65B3-11d1-A29F-00AA00C14882" xmlns:rs="urn:schemas-microsoft-com:rowset" xmlns:z="#RowsetSchema">
<s:Schema id="RowsetSchema">
<s:ElementType name="row" content="eltOnly" rs:CommandTimeout="30">
<s:AttributeType name="ows_ID" rs:name="ID" rs:number="1">
<s:datatype dt:type="i4" dt:maxLength="4" />
</s:AttributeType>
<s:AttributeType name="ows_DocIcon" rs:name="Type" rs:number="2">
<s:datatype dt:type="string" dt:maxLength="512" />
</s:AttributeType>
<s:AttributeType name="ows_LinkTitle" rs:name="Title" rs:number="3">
<s:datatype dt:type="string" dt:maxLength="512" />
</s:AttributeType>
<s:AttributeType name="ows_ServiceCategory" rs:name="Service Category" rs:number="4">
<s:datatype dt:type="string" dt:maxLength="512" />
</s:AttributeType>
</s:ElementType>
</s:Schema>
<rs:data>
<z:row ows_ID="2" ows_LinkTitle="Sample Data 1" />
<z:row ows_ID="3" ows_LinkTitle="Sample Data 2" />
<z:row ows_ID="4" ows_LinkTitle="Sample Data 3" />
</rs:data>
</xml>
Alles was ich wirklich will ist das <z:row>
.
Bisher habe ich verwendet:
$.get(xmlPath, {}, function(xml) {
$("rs:data", xml).find("z:row").each(function(i) {
alert("found zrow");
});
}, "xml");
mit wirklich keinem Glück. Irgendwelche Ideen?
javascript
jquery
xml
namespaces
xsd
Brian Liang
quelle
quelle
Antworten:
Ich habe es verstanden.
Es stellt sich heraus, dass es erforderlich ist
\\
, dem Doppelpunkt zu entkommen.Wie Rich betonte:
Die bessere Lösung erfordert kein Escape und funktioniert auf allen "modernen" Browsern:
quelle
$('[nodeName=rs:data]', xml).find('[nodeName=z:row]')
- funktioniert mit 1.3.2 unter WebKit (wo die Methode des entkommenen Doppelpunkts anscheinend nicht funktioniert)$('[nodeName=rs:data],data')
rs
,dt
oders
sind wirklich nicht die Namensräume. Die Namespaces sind die URNs am Anfang der Datei. Die Präfixe sind nur Aliase, die vom Dokumentautor ausgewählt wurden, um die Dinge kurz zu halten. Dasselbe Dokument, das mit denselben Namespaces übereinstimmt, kann mit völlig unterschiedlichen Präfixen erstellt werden. Ich möchte alle dazu ermutigen, nach APIs zu suchen, die Namespaces verstehen, anstatt Präfixe in Ihren Abfragen anzunehmen. ZB können Sie in der Browser-DOM-APIgetElementByTagNameNS()
und verwendengetAttributeNS()
.Ich habe mehrere Stunden damit verbracht, über Plugins und alle möglichen Lösungen zu lesen, ohne Glück.
ArnisAndy hat einen Link zu einer jQuery-Diskussion gepostet, in der diese Antwort angeboten wird, und ich kann bestätigen, dass dies für mich in Chrome (Version 18.0), FireFox (Version 11.0), IE (Version 9.08) und Safari (Version 5.1.5) funktioniert ) mit jQuery (v1.7.2).
Ich versuche, einen WordPress-Feed zu kratzen, in dem der Inhalt <content: encoded> heißt, und das hat bei mir funktioniert:
quelle
.each()
Schleife verwendete, umitem
Elemente zu durchlaufen :$('dc\\:creator, creator', this).text()
. Ich bin mir jedoch nicht sicher, warum das Extra, creator
benötigt wurde unddc\\:creator
nicht nur funktioniert hat.Wenn Sie jquery 1.5 verwenden, müssen Sie Anführungszeichen um den Attributwert der Knotenauswahl hinzufügen, damit dies funktioniert:
quelle
Obwohl die obige Antwort richtig zu sein scheint, funktioniert sie in Webkit-Browsern (Safari, Chrome) nicht. Eine bessere Lösung, glaube ich, wäre:
quelle
$('[nodeName=rs:data],data')
Falls jemand dies ohne jQuery tun muss , nur mit normalem Javascript, und für Google Chrome (Webkit) , ist dies die einzige Möglichkeit, die ich nach vielen Recherchen und Tests zum Laufen gebracht habe .
Dies funktioniert zum Abrufen des folgenden Knotens :
<prefix:name>
. Wie Sie sehen können, wird das Präfix oder der Namespace weggelassen und es werden Elemente mit unterschiedlichen Namespaces abgeglichen, sofern der Tag-Name lautetname
. Aber hoffentlich ist dies kein Problem für Sie.Nichts davon hat bei mir funktioniert (ich entwickle eine Google Chrome-Erweiterung):
getElementsByTagNameNS("prefix", "name")
getElementsByTagName("prefix:name")
getElementsByTagName("prefix\\:name")
getElementsByTagName("name")
Edit : nach etwas Schlaf, fand ich eine Arbeits Abhilfe :) Diese Funktion gibt den ersten Knoten eine vollständige Anpassung
nodeName
wie<prefix:name>
:Es kann leicht geändert werden, falls Sie alle übereinstimmenden Elemente zurückgeben müssen. Ich hoffe es hilft!
quelle
Keine der oben genannten Lösungen funktioniert so gut. Ich habe das gefunden und wurde für die Geschwindigkeit verbessert. füge dies einfach hinzu, wirkte wie ein Zauber:
Verwendung:
Quelle: http://www.steveworkman.com/html5-2/javascript/2011/improving-javascript-xml-node-finding-performance-by-2000/
quelle
Das "\\" Entkommen ist nicht kinderleicht und einfach
Die Methode scheint ab Jquery 1.7 gebrochen worden zu sein. Hier konnte ich mithilfe einer Filterfunktion eine Lösung für 1.7 finden: Verbessern der Leistung beim Finden von Javascript-XML-Knoten
quelle
Es ist erwähnenswert, dass es ab jQuery 1.7 Probleme mit einigen Workarounds zum Auffinden von Elementen mit Namespace gab. Weitere Informationen finden Sie unter diesen Links:
quelle
Gefundene Lösung im Kommentar: Parsen von XML mit Namespaces mit jQuery $ (). Find
Mein Setup:
Beispiel-XML (Ausschnitt aus der Google Contacts-API):
Parsing-Code:
Plnkr: http://plnkr.co/edit/l8VzyDq1NHtn5qC9zTjf?p=preview
quelle
jQuery 1.7 funktioniert nicht mit folgenden Funktionen:
Eine Lösung, die ich in Chrome, Firefox und IE zum Laufen gebracht habe, besteht darin, Selektoren zu verwenden, die in IE funktionieren, UND Selektoren, die in Chrome funktionieren, basierend auf der Tatsache, dass eine Möglichkeit in IE und die andere in Chrome funktioniert:
In IE werden Knoten zurückgegeben, die den Namespace verwenden (Firefox und IE erfordern den Namespace), und in Chrome gibt der Selektor Knoten zurück, die auf dem Nicht-Namespace-Selektor basieren. Ich habe dies nicht in Safari getestet, aber es sollte funktionieren, da es in Chrome funktioniert.
quelle
Meine Lösung (weil ich einen PHP-Proxy verwende) besteht darin, den Namespace durch _ ... zu ersetzen, damit keine Namespace-Probleme mehr auftreten ;-)
Halte es einfach !
quelle
Ursprüngliche Antwort: jQuery XML analysiert, wie Elementattribute abgerufen werden
Hier ist ein Beispiel, wie Sie den Wert in Chrome erfolgreich abrufen können.
quelle
Ab Anfang 2016 funktioniert für mich die folgende Syntax mit jQuery 1.12.0:
.find("z\\:row")
.find("z\\:row")
.find("row")
Die Syntax
.find("[nodeName=z:row]")
funktioniert in keinem der oben genannten Browser. Ich habe keine Möglichkeit gefunden, einen Namespace in Chrome anzuwenden.Alles in allem funktioniert die folgende Syntax in allen oben genannten Browsern:
.find("row,z\\:row")
quelle
Wie oben erwähnt, gibt es Probleme mit der oben genannten Lösung mit aktuellen Browsern / Versionen von jQuery - das vorgeschlagene Plug-In funktioniert auch aufgrund von Groß- und Kleinschreibung nicht vollständig (
nodeName
als Eigenschaft wird manchmal in Großbuchstaben geschrieben). Also schrieb ich die folgende Schnellfunktion:Anwendungsbeispiel:
quelle
Inhalt:
$this.find("content\\:encoded, encoded").text()
ist die perfekte Lösung ...
quelle
Es gibt ein Plugin jquery-xmlns für jQuery, um mit Namespaces in Selektoren zu arbeiten.
quelle
Ich habe keine Dokumentation zur Verwendung von JQuery zum Parsen von XML gesehen. JQuery verwendet normalerweise den Browser dom, um ein HTML-Dokument zu durchsuchen. Ich glaube nicht, dass es das HTML selbst liest.
Sie sollten sich wahrscheinlich die integrierte XML-Behandlung in JavaScript selbst ansehen.
http://www.webreference.com/programming/javascript/definitive2/
quelle
responseXML
Eigenschaft des integriertenXMLHttpRequest
Objekts, bei dem es sich tatsächlich um ein XML-Dokument handelt. JQuery (bisparseXML
zur Einführung von 1.5 ) hatte jedoch keine Möglichkeit, XML zu analysieren, sodass Chris Recht hatte.habe gerade den Namespace durch eine leere Zeichenfolge ersetzt. Funktioniert gut für mich. Getestete Lösung für alle Browser: Firefox, IE, Chrome
Meine Aufgabe war es, eine EXCEL-Datei über die Sharepoint EXCEL REST API zu lesen und zu analysieren. Die XML-Antwort enthält Tags mit dem Namespace "x:".
Ich habe beschlossen, den Namespace im XML durch eine leere Zeichenfolge zu ersetzen. Funktioniert folgendermaßen: 1. Holen Sie den gewünschten Knoten aus der XML-Antwort heraus. 2. Konvertieren Sie den ausgewählten Knoten XML-Response (Document) in String. 2. Ersetzen Sie den Namespace durch eine leere Zeichenfolge. 3. Konvertieren Sie die Zeichenfolge zurück in XML-Document
Siehe Code-Gliederung hier ->
Für die Konvertierung von XML in String finden Sie hier eine Lösung: http://www.sencha.com/forum/showthread.php?34553-Convert-DOM-XML-Document-to-string
quelle
Alternativ können Sie den Fast-XML-Parser in Ihrem Projekt verwenden und die XML-Daten in ein JS / JSON-Objekt konvertieren. Dann können Sie es als Objekteigenschaft verwenden. Es verwendet weder JQuery noch andere Bibliotheken, löst jedoch Ihren Zweck.
Sie können Namespaces ignorieren, während Sie das Objekt js / json analysieren. In diesem Fall können Sie direkt auf as zugreifen
jsObj.xml.data.row
.Haftungsausschluss : Ich habe einen Fast-XML-Parser erstellt.
quelle
Bei Webkit-Browsern können Sie den Doppelpunkt einfach weglassen.
<media:content>
Um dies beispielsweise in einem RSS-Feed zu finden , können Sie Folgendes tun:quelle