2017-04-22 3 views
-1

Ich versuche, eine XML-Zeichenfolge mit einem regulären Ausdruck durchlaufen, um eine sinnvolle Zeichenfolge daraus zu erstellen.Analysieren Sie ein XML in eine Zeichenfolge mit geschachtelten Klammern

Das XML steht für einen verschachtelten booleschen Ausdruck.

Ich habe es so, es wird die Werte, die Teil der Gleichheiten sind extrahieren, aber ich kann nicht herausfinden, wie die AND/OR-Operatoren, noch die Klammern, die im Endergebnis benötigt werden. Diese

ist, was die XML wie folgt aussieht:

<applic id="TCTO_709_PRE_ALL"> 
<displayText><simplePara>All Aircraft without Extended Range Capability</simplePara></displayText> 
<!--BEGIN OR--> 
<evaluate andOr="or"> 
<!-- (--> 
    <assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-15" /> 
<!--BEGIN AND--> 
<evaluate andOr="and">  
    <!-- (--> 
<!--BEGIN OR--> 
    <evaluate andOr="or"> 
    <!-- (--> 
     <assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-10" /> 
     <assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-12" /> 
    <!--) --> 
    </evaluate> 
<!--BEGIN OR--> 
    <evaluate andOr="or"> 
     <!-- (--> 
     <assert applicPropertyIdent="TCTO_1Q-9A-709" applicPropertyType="condition" applicPropertyValues="PRE" /> 
     <assert applicPropertyIdent="TCTO_1Q-9A-709" applicPropertyType="condition" applicPropertyValues="NOI" /> 
     <!--) --> 
    </evaluate> 
    <!--) --> 
    </evaluate> 
    <!--) --> 
</evaluate> 
</applic> 

Alle <assert> Elemente in AND oder OR <evaluate> Elemente eingeschlossen sind.

Dies ist das gewünschte Ergebnis für das XML:

(partno="UHK97000-15" or ((partno="UHK97000-10" or partno="UHK97000-12") and (TCTO_1Q-9A-709="PRE" or TCTO_1Q-9A-709="NOI"))) 

Hier ist mein Skript, mit denen ich versuche:

var sApplic = '<applic id="TCTO_709_PRE_ALL"><displayText><simplePara>All Aircraft without Extended Range Capability</simplePara></displayText><evaluate andOr="or"><assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-15"></assert><evaluate andOr="and"><evaluate andOr="or"><assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-10"></assert><assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-12"></assert></evaluate><evaluate andOr="or"><assert applicPropertyIdent="TCTO_1Q-9A-709" applicPropertyType="condition" applicPropertyValues="PRE"></assert><assert applicPropertyIdent="TCTO_1Q-9A-709" applicPropertyType="condition" applicPropertyValues="NOI"></assert></evaluate></evaluate></evaluate></applic>'; 
var sRegXEval = /<assert applicPropertyIdent="(.*?)" applicPropertyType=".*?" applicPropertyValues=(".*?")(\/>|<\/assert>)?/g; 
var sMatch = sRegXEval.exec(sApplic); 
while (sMatch != null) { 
     var sFirst = sMatch[1] + "=" + sMatch[2]; 
      document.write("<p>sMatch[" + i +"]" + sFirst); 
    sMatch = sRegXEval.exec(sApplic); 
    i++; 
} 
</script> 

Hier sind die Ergebnisse dieser Schrift, die von der nach wie vor weit sind gewünschtes Ergebnis:

sMatch[0]partno="UHK97000-15" 
sMatch[1]partno="UHK97000-10" 
sMatch[2]partno="UHK97000-12" 
sMatch[3]TCTO_1Q-9A-709="PRE" 
sMatch[4]TCTO_1Q-9A-709="NOI" 

Wie kann ich den Code verbessern, um das gewünschte Ergebnis zu erhalten?

UPDATED Der XML-String hat sich geändert

var sApplic = '<datamodule><file>CClasic.sgm</file><applic><displayText><simplePara>Cooking Classics</simplePara></displayText><assert applicPropertyIdent="author" applicPropertyType="prodattr" applicPropertyValues="Crocker"/></applic></datamodule>'; 

Da ich diese den Code getan haben @trincot gab mir nicht mehr funktioniert. Wie verbessere ich das Skript, um diese neue Zeichenfolge aufzunehmen, und erlaube mir, den Dateinamen auch im Element anzuzeigen?

+0

Bitte versuchen Sie es klarer zu sein, wenn Fragen hier zu fragen. Was sind Formelergebnisse? Was ist das Testobjekt? Sie haben nicht einmal die gewünschte Ausgabe geschrieben. Ich hasse es, wenn jemand wirklich Hilfe will, aber nicht richtig danach fragt. Lies [hier] (https://stackoverflow.com/help/mcve) – bugwheels94

+0

Ich löschte meine Antworten und änderte meine erste Frage, um die Dinge hoffentlich besser zu klären. Danke für die Information. –

+0

Die Werte, die ich extrahiere, sind appsPropertyIdent = "VALUE1" appsPropertyValues ​​= "VALUE2" Das Array zieht sie im Skript mit dem regulären Ausdruck. Worauf ich Probleme habe, ist, dass die Klammern vor und nach den Elementen eingefügt werden. Besonders schwierig ist es, wenn Sie nach dem gefundenen Array den Wert (OR/AND) hinzufügen müssen. Zum Beispiel (partno = "PRE" oder .Das ist, was ich nicht herausfinden kann, was zu tun ist. –

Antwort

0

Sie sollten nicht versuchen, XML mit regulären Ausdrücken zu analysieren: Sie sind für eine solche Aufgabe nicht gut geeignet.

Verwenden Sie stattdessen die DOM parser that the Web API offers in all major browsers, und eine rekursive Funktion, die dafür sorgen, wird die Booleschen Operatoren und Klammern einzufügen:

function parse(node) { 
 
    return Array.from(node.children, child => 
 
     child.tagName === 'assert' 
 
      ? child.getAttribute('applicPropertyIdent') 
 
       + '="' + child.getAttribute('applicPropertyValues') + '"' 
 
      : child.tagName === 'evaluate' 
 
       ? '(' + parse(child) + ')' 
 
       : parse(child) 
 
    ).filter(Boolean).join(' ' + node.getAttribute('andOr') + ' '); 
 
} 
 

 
const sApplic = `<datamodule> 
 
<file>CClasic.sgm</file> 
 
<applic id="TCTO_709_PRE_ALL"> 
 
    <displayText> 
 
     <simplePara>All Aircraft without Extended Range Capability</simplePara> 
 
    </displayText> 
 
    <evaluate andOr="or"> 
 
     <assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-15"></assert> 
 
     <evaluate andOr="and"> 
 
      <evaluate andOr="or"> 
 
       <assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-10"></assert> 
 
       <assert applicPropertyIdent="partno" applicPropertyType="prodattr" applicPropertyValues="UHK97000-12"></assert> 
 
      </evaluate> 
 
      <evaluate andOr="or"> 
 
       <assert applicPropertyIdent="TCTO_1Q-9A-709" applicPropertyType="condition" applicPropertyValues="PRE"></assert> 
 
       <assert applicPropertyIdent="TCTO_1Q-9A-709" applicPropertyType="condition" applicPropertyValues="NOI"></assert> 
 
      </evaluate> 
 
     </evaluate> 
 
    </evaluate> 
 
    </applic> 
 
</datamodule>`; 
 

 
const xml = (new window.DOMParser()).parseFromString(sApplic, "text/xml"); 
 
const result = parse(xml.documentElement); 
 
console.log(result);

+0

Das ist so unglaublich, danke. Die Frage ist, ich bin das auf zehntausend Dokumente laufen, also muss ich sein Ich bin es gewohnt, einen Texteditor (UltraEditStudio) zu verwenden, nicht den DOM-Parser.Für eine Weile benutzte ich XSLT, aber diese Fähigkeit ging weg, da Arbeitsfristen hartnäckig wurden. –

+0

Wenn diese Antwort Ihren Anforderungen entspricht, [bitte die Antwort als akzeptiert markieren] (http://stackoverflow.com/help/someone-answers). – trincot

+0

Ich musste meine XML-Zeichenfolge um den Dateinamen erweitern und muss jetzt extrahieren, die Anwendungs-ID und SimplePara-Werte. –

Verwandte Themen