2009-08-26 14 views
0

Was ist der richtige Weg wäre, eine Zeichenfolge wie diese in einem großen xml zu finden:Regex eine XML-Zeichenfolge

<ser:serviceItemValues> 
    <ord1:label>Start Type</ord1:label> 
    <ord1:value>Loop</ord1:value> 
    <ord1:valueCd/> 
    <ord1:activityCd>iactn</ord1:activityCd> 
</ser:serviceItemValues> 

1. in diesem xml es oben mit unterschiedlichen Werten eine Menge Wiederholungen des Elements sein (Loop usw.) und andere XML-Elemente in diesem Dokument. Hauptsächlich geht es mir darum, ob es einen ServiceItemValues ​​gibt, der keinen 'Loop' als Wert hat. Ich habe versucht, diese, aber es scheint nicht zu Arbeit:

private static Pattern LOOP_REGEX = 
     Pattern.compile("[\\p{Print}]*?<ord1:label>Start Type</ord1:label>[\\p{Print}]+[^(Loop)][\\p{Print}]+</ser:serviceItemValues>[\\p{Print}]*?", Pattern.CASE_INSENSITIVE|Pattern.MULTILINE); 

Dank

+0

Danke für alle Kommentare, lassen Sie mich ein wenig für diejenigen, die sagen, nicht Regex zu verwenden. Es ist mir egal, was der Wert ist, ich versuche nicht, es zu bekommen. Ich will nur sicher sein, dass es eine Schleife sagt, wenn nicht, werde ich eine Ausnahme werfen. Also ich denke, es ist Validierung, aber ich kann das Xsd nicht ändern. – arinte

+1

Ich glaube jeder versteht, was Sie versuchen zu tun. Reguläre Ausdrücke sind jedoch nicht die beste Lösung. Markup wird am besten Parsern überlassen. – doomspork

Antwort

3

Nachschlagen XPath, das ist ein bisschen wie Regex für XML. Irgendwie.

Mit XPath schreiben Sie Ausdrücke, die Informationen aus XML-Dokumenten extrahieren, also ist das Extrahieren der Knoten, die Loop nicht als Unterknoten haben, genau die Art von Dingen, für die es bestimmt ist.

ich nicht versucht, aber als erster Stich, würde ich den XPath-Ausdruck erraten würde ungefähr so ​​aussehen:

"//ser:serviceItemValues/ord1:value[text()!='Loop']/parent::*" 
+0

Stop upvoting dies, Sie alle wissen, das ist der falsche Weg, um das Problem anzugehen :( – Esko

+1

Warum ist das falsch? Das ist genau was Xpath ist für, nicht wahr? – izb

4

Reguläre Ausdrücke sind nicht die beste Wahl, wenn große Mengen von HTML oder XML-Parsing.

Es gibt eine Reihe von Möglichkeiten, mit denen Sie ohne reguläre Ausdrücke umgehen können. Abhängig von den Bibliotheken, die Ihnen zur Verfügung stehen, können Sie mit XPaths die gesuchten Elemente finden.

Heres ein hilfreiches Tutorial, das Ihnen auf Ihrem Weg helfen kann: http://www.totheriver.com/learn/xml/xmltutorial.html

3

Regulärer Ausdruck ist nicht das richtige Werkzeug für diesen Job. Sie sollten einen XML-Parser verwenden. Es ist ziemlich einfach einzurichten und zu verwenden, und wird wahrscheinlich weniger Zeit für den Code benötigen. Es wird dann mit diesem regulären Ausdruck kommen.

Ich empfehle die Verwendung JDOM. Es hat eine einfache Syntax. Ein Beispiel ist hier zu finden: http://notetodogself.blogspot.com/2008/04/teamsite-dcr-java-parser.html

Wenn die Dokumente, die Sie groß sind, werden Parsen wird, können Sie einen SAX-Parser verwenden sollten, empfehle ich Xerces.

1

Wenn Sie mit XML arbeiten, sollten Sie wahrscheinlich keine regulären Ausdrücke verwenden, um den Inhalt zu überprüfen. Verwenden Sie stattdessen entweder eine SAX-Analyse-basierte Routine, um relevante Inhalte zu überprüfen, oder ein DOM-ähnliches Modell (vorzugsweise Pull-basiert, wenn Sie mit großen Dokumenten arbeiten).

Natürlich, wenn Sie versuchen, den Inhalt des Dokuments irgendwie zu überprüfen, sollten Sie wahrscheinlich ein Schema-Tool verwenden (ich würde mit RELAX NG oder Schematron gehen, aber ich denke, Sie könnten XML-Schema verwenden).

1

Wie die anderen Antworten erwähnt, reguläre Ausdrücke sind nicht das Werkzeug für die Arbeit. Sie benötigen eine XPath-Engine. Wenn Sie diese Dinge jedoch von der Befehlszeile aus möchten, empfehle ich, XMLStar zu installieren. Ich habe sehr gute Erfahrungen mit diesem Tool und löse verschiedene XML-bezogene Aufgaben. Abhängig von Ihrem Betriebssystem können Sie möglicherweise das Paket xmlstarlet RPM oder deb installieren. Mac OS X Ports enthält das Paket auch, denke ich.

+0

Ups, Sie wollten es in Java tun. Nun xmlstar ist immer noch ein cooles Werkzeug. – Hardy