jQuery XML parsing avec des espaces de noms
Je suis nouveau sur jQuery et souhaitez analyser un document xml.
Je suis capable d'analyser XML régulières avec les espaces de noms par défaut, mais avec xml tels que:
<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>
Tout ce que je veux vraiment sont les <z:row>
's.
Jusqu'à présent, j'ai fait:
$.get(xmlPath, {}, function(xml) {
$("rs:data", xml).find("z:row").each(function(i) {
alert("found zrow");
});
}, "xml");
Avec vraiment pas de chance. Des idées? Merci.
- Omettre le préfixe d'espace de noms a fonctionné pour moi. Voir cette réponse: stackoverflow.com/a/25089647/2539811
Vous devez vous connecter pour publier un commentaire.
Je l'ai eu.
S'avère qu'il exige
\\
pour échapper à la virgule.Riches comme l'a souligné:
La meilleure solution ne nécessite pas de s'échapper et fonctionne sur tous les "modernes" navigateurs:
$('[nodeName=rs:data]', xml).find('[nodeName=z:row]')
- fonctionne avec 1.3.2 sous WebKit (où l'échappé du côlon méthode ne semble pas)$('[nodeName=rs:data],data')
.find("[nodeName='namespace:name']")
Les guillemets simples sont importantes ou il va générer des erreurs. Vous pouvez utiliser,name
comme ci-dessus, pas sûr qu'il offre quoi que ce soit.rs
,dt
ous
sont vraiment pas les espaces de noms. Les espaces de noms sont les Urnes en haut du fichier. Les préfixes sont des alias choisi par l'auteur du document à garder les choses à court. Le même document, correspondant aux mêmes espaces de noms pourraient être créés avec des préfixes différents. J'encourage tout le monde à regarder pour les Api qui comprennent des espaces de noms au lieu de supposer que les préfixes dans vos requêtes. E. g., dans le navigateur DOM API, vous pouvez utilisergetElementByTagNameNS()
etgetAttributeNS()
.J'ai passé plusieurs heures sur cette lecture, les plugins et toutes sortes de solutions à pas de chance.
ArnisAndy posté un lien vers un jQuery discussion, où cette réponse est offert, et je confirme que cela fonctionne pour moi en Chrome(v18.0), FireFox(v11.0), c'est à dire(v9.08) et Safari (v5.1.5) à l'aide de jQuery (v1.7.2).
Je suis en train de gratter un WordPress flux où le contenu est nommé <content:encoded> et c'est ce qui a fonctionné pour moi:
.each()
de la boucle pour parcourir par le biais deitem
éléments:$('dc\\:creator, creator', this).text()
. Cependant, je ne sais pas pourquoi les extra, creator
était nécessaire, etdc\\:creator
n'est pas le travail.Si vous utilisez jquery 1.5, vous devrez ajouter des guillemets autour du nœud sélecteur de valeur d'attribut pour le faire fonctionner:
Bien que la réponse ci-dessus semble être correct, il ne fonctionne pas dans les navigateurs webkit (Safari, Chrome). Une meilleure solution, je crois, serait:
$('[nodeName=rs:data],data')
Dans le cas où quelqu'un doit faire ce sans jQuery, juste avec Javascript normale, et pour Google Chrome (webkit), c'est le seul moyen que j'ai trouvé pour le faire fonctionner après beaucoup de recherches et de tests.
Qui va travailler pour récupérer le nœud suivant:
<prefix:name>
. Comme vous pouvez le voir le préfixe ou un espace de noms est omis, et il va faire correspondre les éléments avec des espaces de noms différents à condition que le nom de la balise estname
. Mais j'espère que ce ne sera pas un problème pour vous.Rien de tout cela a fonctionné pour moi (je développe un Google Chrome extension):
getElementsByTagNameNS("prefix", "name")
getElementsByTagName("prefix:name")
getElementsByTagName("prefix\\:name")
getElementsByTagName("name")
Modifier: après quelques heures de sommeil, j'ai trouvé un travail solution de contournement 🙂 Cette fonction renvoie le premier nœud correspondant à un plein
nodeName
comme<prefix:name>
:Il peut facilement être modifié dans le cas où vous devez retourner tous les éléments correspondants. Espérons que cela aide!
Aucune des solutions ci-dessus ne fonctionne plus très bien. J'ai trouvé cela et a été amélioré pour la vitesse. il suffit d'ajouter ce, a fonctionné comme un charme:
utilisation:
source: http://www.steveworkman.com/html5-2/javascript/2011/improving-javascript-xml-node-finding-performance-by-2000/
Le "\\" évitement n'est pas infaillible et que le simple
Méthode semble avoir été brisé comme de Jquery 1.7. J'ai été en mesure de trouver une solution pour la 1.7 , à l'aide d'une fonction de filtre, ici: L'amélioration de Javascript XML Nœud de Trouver de la Performance
Il est intéressant de noter que, à compter de jQuery 1.7 il y avait des problèmes avec certaines des solutions de rechange pour la recherche d'espace de noms des éléments. Voir ces liens pour plus d'informations:
Trouvé la solution dans le commentaire: L'analyse de XML avec des espaces de noms à l'aide de jQuery $().trouver
Ma configuration:
XML exemple (extrait de Contacts Google API):
Code d'analyse:
Plnkr: http://plnkr.co/edit/l8VzyDq1NHtn5qC9zTjf?p=preview
jQuery 1.7 ne fonctionne pas avec les éléments suivants:
Une solution qui j'ai eu à travailler dans Chrome, Firefox et IE est d'utiliser des sélecteurs qui travaillent dans IE ET des sélecteurs qui travaillent dans Chrome, basée sur le fait que, d'une façon fonctionne sous IE, et l'autre dans Chrome:
Dans IE, ce retourne les nœuds à l'aide de l'espace de noms (Firefox et IE besoin de l'espace de noms), et dans Chrome, le sélecteur retourne les nœuds basé sur le sélecteur d'espace de noms. Je n'ai pas testé sur Safari, mais il doit fonctionner car il fonctionne dans Chrome.
Ma solution (parce que j'utilise un proxy Php) est à remplacer : espace de noms par l' _ ... donc pas plus de problèmes d'espace de noms 😉
Keep it simple !
Réponse Originale À Cette Question : jQuery XML parsing comment obtenir de l'attribut d'élément
Voici un exemple de comment réussir à obtenir la valeur en Chrome..
Dès le début de l'année 2016, pour moi la syntaxe suivante fonctionne avec jQuery 1.12.0:
.find("z\\:row")
.find("z\\:row")
.find("row")
La syntaxe
.find("[nodeName=z:row]")
ne fonctionne pas dans l'un des navigateurs mentionnés ci-dessus. Je n'ai trouvé aucun moyen d'appliquer un espace de noms dans google Chrome.Mettre tous ensemble, la syntaxe suivante fonctionne dans tous les navigateurs mentionnés ci-dessus:
.find("row,z\\:row")
Comme mentionné ci-dessus, il y a des problèmes avec la solution ci-dessus avec les navigateurs actuels/versions de jQuery - l'a suggéré plug-in n'est pas complètement le travail, soit en raison de cas de questions (
nodeName
, en tant que propriété, est parfois en majuscules). Donc, j'ai écrit ce rapide fonction:Exemple d'utilisation:
contenu:
$this.find("content\\:encoded, encoded").text()
est la solution parfaite...
Il y a un plugin jquery-xmlns pour jQuery de travailler avec des espaces de noms dans les sélecteurs.
Je n'ai pas vu toute la documentation sur l'utilisation de JQuery pour analyser le langage XML.
JQuery utilise généralement le Navigateur dom pour parcourir un document HTML, je ne crois pas qu'il lit le html lui-même.
Vous devriez probablement regarder le bâti de la gestion XML en JavaScript lui-même.
http://www.webreference.com/programming/javascript/definitive2/
responseXML
propriété de l'intégré dansXMLHttpRequest
objet, qui est en effet un document XML. Cependant, jQuery (jusqu'à 1.5, quandparseXML
a été introduit) n'avait aucun moyen de l'analyse de XML, de sorte que Chris avait raison.juste remplacé les noms par une chaîne vide. Fonctionne très bien pour moi. Solution testée sur tous les navigateurs: Firefox, IE, Chrome
Ma tâche était de lire et d'analyser un fichier EXCEL via Sharepoint, EXCEL API REST. Le XML de la réponse contient des balises avec "x:" espace de noms.
J'ai décidé de remplacer l'espace de noms dans le fichier XML par une chaîne vide. Fonctionne de cette façon:
1. Obtenir le nœud de l'intérêt de XML-réponse
2. Convertir le nœud sélectionné XML-Réponse (Document) à la Chaîne
2. Remplacez les noms par une chaîne vide
3. Convertit une chaîne de retour à XML-Document
Voir le code présenter ici -->
Pour XML Chaîne de conversion de trouver une solution ici:
http://www.sencha.com/forum/showthread.php?34553-Convert-DOM-XML-Document-to-string
Alternativement, vous pouvez utiliser rapide-xml-parser dans votre projet, et de convertir les données XML dans JS/objet JSON. Ensuite, vous pouvez l'utiliser comme objet de propriété. Il n'utilise pas JQuery ou d'autres bibliothèques, mais ça va résoudre votre problème.
JS:
HTML:
Vous pouvez ignorer les espaces de noms lors de l'analyse js/objet json. Dans ce cas, vous pouvez accéder directement comme
jsObj.xml.data.row
.Avertissement: j'ai créé rapide-xml-parser.
Pour les navigateurs Webkit, vous pouvez simplement laisser tomber le côlon. Afin de trouver
<media:content>
dans un flux RSS par exemple, vous pouvez faire ceci: