2010-11-09 3 views
0

Je suis assez nouveau pour javascript et j'essaye de développer des scripts pour une application basée sur java et utilise javascript comme interface pour traiter/modifier des informations de projet XML en ligne. Il n'y a pas de navigateur impliqué. J'utilise rhino dans un shell pour imiter l'environnement d'application afin de tester et construire les javascripts nécessaires pour analyser et modifier le XML.Parse XML en javascript - pas de navigateur - pas de parseur XML

L'objectif est de pouvoir lire dans un projet XML un modèle contenant de nombreux paramètres de traitement optionnels et de supprimer des sections entières de XML si cette fonction de traitement n'est pas nécessaire. De plus, j'ai besoin de modifier des valeurs spécifiques dans le XML, ce que je suis capable de faire, comme indiqué ci-dessous.

Voici un dépouillé fichier de projet XML (sample_proj.xml):

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<PROFILE lastSavedByAppVersion="" type="project" version="1"> 
<OPTIONS processingmode="concurrent"/> 
<ENCODESESSION name="My_session"> 
    <OPTIONS framesizemode="custom"/> 
    <PLUGINGROUP> 
    <PLUGIN duration="0" endOffset="0" name="Gamma.plugin" repeats="1" startOffset="0"> 
    <PARAMGROUP event_id="0" keyframe="0"> 
    <PARAM> 
     <NAME>Cb</NAME> 
     <VALUE>1.0</VALUE> 
    </PARAM> 
    <PARAM> 
     <NAME>Cr</NAME> 
     <VALUE>1.0</VALUE> 
    </PARAM> 
    <PARAM> 
     <NAME>Y</NAME> 
     <VALUE>1.0</VALUE> 
    </PARAM> 
    </PARAMGROUP> 
    </PLUGIN> 
    <PLUGIN duration="300" endOffset="0" name="Overlay.plugin" repeats="1" startOffset="0"> 
    <PARAMGROUP event_id="0" keyframe="0"> 
    <PARAM> 
     <NAME>Filename</NAME> 
     <VALUE></VALUE> 
    </PARAM> 
    </PARAMGROUP> 
    </PLUGIN> 
    </PLUGINGROUP> 
</ENCODESESSION> 
<EVENTTIMELINE dropframe="1" fps="24"> 
    <EVENT id="0"> 
    <FRAME>0</FRAME> 
    <DURATION>0</DURATION> 
    </EVENT> 
</EVENTTIMELINE> 
    <SOURCE batchtype="cliplist" type="filesource"> 
    <MEDIA name="File" type="video"> 
    <FILENAME/> 
    </MEDIA> 
    <MEDIA name="File" type="audio"> 
    <FILENAME/> 
    </MEDIA> 
    <clipListModel audioChannelMask="-1" audioFormat="AUTO" singleOutput="false" videoFormat="AUTO"> 
    <clipList/> 
    </clipListModel> 
    <TIMECODECONFIGURATION> 
    <MODE>none</MODE> 
    </TIMECODECONFIGURATION> 
</SOURCE> 
</PROFILE> 

je peux utiliser le code js suivant dans une coquille de rhinocéros pour lire le fichier puis essayez d'analyser:

importPackage(java.io) 

var project = readFile("sample_proj.xml"); 

project = project.replace(/Gamma/g, "GammaRGB"); 
project = project.replace(/\s*&lt;PLUGIN\s+.*Overlay.*[\s\S]*?\/PLUGIN&gt;/img, ""); 
print(project); 

Le premier project.replace fonctionne comme prévu et remplacera "Gamma.plugin" par "GammaRGB.plugin".

La deuxième regex ne fait cependant rien, bien que la même regex dans les évaluateurs externes de js regex est capable d'analyser et de supprimer toute la seconde section <PLUGIN> Overly.plugin </PLUGIN>. Je suis habitué à construire des expressions rationnelles perl, donc l'expression rationnelle est basée sur ce que j'ai pu apprendre à propos de js et de l'analyse multi-lignes.

J'espérais pouvoir analyser et supprimer des sections XML en javascript pur sans avoir à charger un analyseur XML séparé. Je connais toujours le XML qui sera transmis, donc l'analyse syntaxique de base de texte en XML est préférée.

Merci pour toute aide,

Bill

+0

ne pas utiliser le discours de regexes dans 3 ... 2 ... – mpen

Répondre

0

La seconde regex pourrait ne pas travailler parce que vous utilisez &lt; au lieu de < et &gt; au lieu de >. Le XML est-il échappé avant d'être traité par la regex?

Egalement [\s\S] signifie correspondre à des espaces ou à des espaces non-blancs, ce qui est vraiment identique à .. (À moins que cela ne compense . ne correspond pas aux sauts de ligne.)

+0

J'utilisais initialement <> mais cela ne fonctionnait pas dans certains évaluateurs d'expressions rationnelles externes, donc je suis passé à <et> car ils semblaient aimer cela mieux. Je n'étais pas au courant de l'évasion() jusqu'à ce que vous l'ayez mentionné. Je vais essayer. – billbaggy

+0

Oui, [\ s \ S] devait correspondre aux sauts de ligne ainsi qu'à tous les caractères. – billbaggy

5

En utilisant Rhino, vous pouvez appeler un code Java. (Vous le savez probablement déjà, car votre code utilise clairement le paquetage java.io pour lire le texte d'un fichier.)

Puis-je suggérer la possibilité d'utiliser (à partir de JavaScript) un analyseur DOM Java (tel que est disponible dans java.xml.parsers) pour manipuler le XML, plutôt que d'utiliser Regex? Faire une manipulation XML/HTML avancée avec regex est difficile à faire correctement, surtout si votre logiciel doit accepter de nouvelles entrées inconnues plus tard sur la ligne.

est ici un code Java qui pourraient vous aider à démarrer sur un peu de JavaScript équivalent:

import java.xml.parsers.*; 

java.io.File file = new java.io.File("c:\\sample.xml"); 
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
DocumentBuilder db = dbf.newDocumentBuilder(); 
org.w3c.dom.Document doc = db.parse(file); 

(. Voir aussi Parsing HTML The Cthulhu Way)

+0

Merci. Je vais jeter un coup d'oeil à cette méthode aussi. En aparté, j'ai été capable d'analyser la façon dont j'avais l'intention d'utiliser xml échappé, mais ayant des problèmes étranges avec les données se couper lors de l'échappement et l'écriture dans un nouveau fichier. – billbaggy

+0

puisque rhino est activé par E4X, est-il possible de lire le fichier XML et de le convertir en une chaîne XML javascript qui peut ensuite être directement accessible en utilisant: – billbaggy

+0

var x = new XML (xmlfromfile) – billbaggy