2016-09-26 4 views
0

Ich frage mich, ob es eine Möglichkeit gibt, eine XML-Strings zu teilen.Split XML-Nachrichten von String

Ich habe die Zeichenfolge hier:

<?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam NOT good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam NOT good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam NOT good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam NOT good</Status> </Messages> 
    <?xml version="1.0" encoding="UTF-8"?> <Replies> <Start>Lets go</Start> </Replies> 

so kann ich jede Zeichenfolge als Array erhalten? Da diese

_temp[2] = <?xml version="1.0" encoding="UTF-8"?> <Messages> <Status>Iam NOT good</Status> </Messages> 
+1

Aufteilen nach '[\ r \ n] +'? – BackSlash

+0

@BackSlash Die XML-Zeichenfolge enthält bereits nach dem Nachrichten-Tag "\ r \ n". – Tirolel

+1

Dann aktualisieren Sie Ihre Frage mit der richtigen Formatierung. Wenn die vollständige Zeichenfolge so ist, wie Sie in der Frage geschrieben haben, funktioniert das Teilen mit '[\ r \ n] +'. – BackSlash

Antwort

1

könnten Sie teilen die regex

(?<!\A)(?=<\?xml) 

mit vor jedem <?xml aufzuspalten.

Um zu verhindern, dass die Leerzeichen am Anfang der Eingabe ihr eigener Teil im Split sind, müssen Sie jedoch den Eingang trim eingeben.

Java Beispiel:

String input = " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam NOT good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam NOT good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam NOT good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Messages> <Status>Iam NOT good</Status> </Messages>\n" 
     + " <?xml version=\"1.0\" encoding=\"UTF-8\"?> <Replies> <Start>Lets go</Start> </Replies>"; 

String[] parts = input.trim().split("(?<!\\A)(?=<\\?xml)"); 

for (String s : parts) { 
    System.out.println(s); 
    System.out.println("-------------------------"); 
} 

Hinweis: Dies wird nicht für alle möglichen xmls arbeiten, da <?xml in einem CDATA Elemente enthalten sein, z.B. <![CDATA[<?xml]]>. Um dies zu verhindern, müssen Sie einen XML-Parser verwenden.

+0

Danke für die Antwort, die Regex hat den Job gemacht. – Tirolel

0

Eine andere Möglichkeit, dies zu lesen, wie

try { 
     List<String> lines = Files.readAllLines(Paths.get("<XML FILE PATH>"), 
       Charset.defaultCharset()); 
     System.out.println(lines.size()); 
     for (String line : lines) { 
      System.out.println("==============================="); 
      System.out.println(line); 
     } 

    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

Auf diesem läuft bekam ich eine Liste von 12 Zeilen folgt sein können, die dann unter Verwendung eines Index verarbeitet werden können.