2009-11-22 6 views
1

J'essaie d'utiliser DOMParser ou XPath pour extraire un fragment XML d'un document. Un élément avec DOMParser ou document.evaluate retourne un élément avec une valeur nodeValue nulle, comment récupérer le fragment xml en tant que chaîne? Voici l'exemple que je ne peux pas utiliser dans WebKit.Analyse d'un fragment de chaîne XML hors document en Javascript

XML:

<fetch version="1.0" output-format="xml-platform" mapping="logical" distinct="false"> 
    <entity name="contact"> 
    <attribute name="address1_stateorprovince" /> 
    <attribute name="new_source" /> 
    <attribute name="ownerid" /> 
    <attribute name="new_organization" /> 
    <attribute name="new_lastcontacted" /> 
    <attribute name="emailaddress1" /> 
    <attribute name="address1_city" /> 
    <attribute name="telephone1" /> 
    <order attribute="fullname" descending="false" /> 
    <filter type="and"> 
     <condition attribute="new_conflicting" operator="eq" value="1" /> 
    </filter> 
    <attribute name="fullname" /> 
    <attribute name="new_csuid" /> 
    <attribute name="new_contacttype" /> 
    <attribute name="contactid" /> 
    </entity> 
</fetch> 

Source:

var parser = new DOMParser(); 
var filterXmlDoc = parser.parseFromString(xml, "text/xml"); 
var test = filterXmlDoc.getElementsByTagName("filter")[0]; 
test.nodeValue; // null! 
+0

La classe VTDNav de vtd-xml possède une méthode getElementFragment qui extrait directement un tableau d'octets du fragment d'élément en XML d'origine. –

Répondre

4

nodeValue est la "valeur" du noeud, ce qui n'a pas de sens (et à juste titre null) pour les types d'élément. Ce n'est pas la représentation de chaîne xml du noeud.

Pour WebKit vous pouvez utiliser XMLSerializer pour obtenir la représentation de chaîne Reculez:

var xml = new XMLSerializer().serializeToString(test); 
xml; // <filter type="and"><condition attribute="new_conflicting" operator="eq" value="1"/></filter> 

Mise à jour re commentaire "Y at-il un moyen facile d'obtenir que le xml intérieur?":

Vous pouvez créer un DocumentFragment à partir des noeuds enfant et sérialiser uniquement le fragment:

var frag = filterXmlDoc.createDocumentFragment(); 
while(test.firstChild) { 
    frag.appendChild(test.firstChild); 
} 
var xml = new XMLSerializer().serializeToString(frag); 
xml; // <condition attribute="new_conflicting" operator="eq" value="1"/> 

Notez que cela va vider votre noeud test après l'exécution.

+0

Et voici WebKits documentation incroyablement de haut en bas sur 'XMLSerializer': http://developer.apple.com/mac/library/DOCUMENTATION/AppleApplications/Reference/WebKitDOMRef/XMLSerializer_idl/Classes/XMLSerializer/index.html –

+0

Lol, une blague je le prends? Existe-t-il un moyen facile d'obtenir uniquement le fichier XML interne? – Boog

+0

@ Bobo: Je pense que Apple pourrait être sérieux. Re xml interne, voir ma réponse mise à jour. J'espère que ça aide :) –

0

Essayez:

test.items(0).nodeValue; 

getElementsByTagName() retourne une méthode NodeList vous devez donc utiliser des objets() de cet objet.

Bien Idéalement, vous faire:

if (test.length) 
{ 
    console.log(test.items(0).nodeValue); 
} 
else 
{ 
    console.log('Nothing Found'); 
} 
+0

Je reçois déjà le premier élément renvoyé par getElementsByTagName, nodeValue est null. – Boog

+0

Vous avez raison. Je n'ai pas remarqué ça au début. Bien que je crois que vous pouvez toujours utiliser item() à la place de la référence d'élément de tableau que ce dernier peut avoir des problèmes avec d'autres navigateurs. –