2012-10-31 2 views
6

Ich habe eine XML-Datei wie folgt aus:Wie nach öffnenden und schließenden Tags in XML-Datei mit Java suchen?

<file> 
    <students> 
      <student> 
       <name>Arthur</name> 
       <height>168</height> 
      </student> 
      <student> 
       <name>John</name> 
       <height>176</height> 
      </student> 
    </students> 
</file> 

Wie kann ich überprüfen, ob für jeden Tag zu öffnen, gibt ein End-Tag ist? Zum Beispiel, wenn ich die End-Tag als nicht:

<file> 
    <students> 
      <student> 
       <name>Arthur</name> 
       <height>168</height> 
      // Ending tag for student missing here 
      <student> 
       <name>John</name> 
       <height>176</height> 
      </student> 
    </students> 
</file> 

Wie weiter Parsing den Rest der Datei?

Ich versuchte mit SAX-Parser wie erklärt here, aber es ist nicht sehr geeignet für mich, da es eine Ausnahme auslöst, falls ich kein schließendes Tag als in der zweiten XML-Code zur Verfügung gestellt habe.

+4

Und was möchten Sie tun, anstatt eine Ausnahme zu werfen? –

+3

Warum ist es nicht geeignet? Sie können versuchen, die Ausnahme abzufangen und weiterzugehen. –

+1

Stattdessen sollten Sie die XML-Datei korrigieren. Oder, wenn jemand anderes dies macht, dann informieren Sie sie. –

Antwort

0

Eine XML-Datei, die Ihre Bedingung nicht bestätigt "für jedes öffnende Tag gibt es ein End-Tag" ist nicht well formed. Um zu überprüfen, ob eine XML-Datei wohlgeformt ist, ist der erste Job eines XML-Parsers (es ist seine erste Aufgabe). Daher benötigen Sie einen XML-Parser.

0

Das Tutorial, das Sie gefunden haben, hat einen Fehler darin. characters() vielleicht mehrere Male für das gleiche Element (source) aufgerufen. Die richtige Art, das Ende eines Elements zu markieren, besteht darin, die entsprechenden booleschen Zustände innerhalb von endElement() zurückzusetzen. Der Code comments section enthält die erforderliche Änderung.

Mit diesem Problem behoben, können Sie Fehler in startElement() überprüfen, um sicherzustellen, dass die Datei nicht versucht, ein ungültiges Element mit dem aktuellen Status zu starten. Dadurch können Sie auch sicherstellen, dass ein name Element nur in einem student Element gefunden wird.

0

Sie können den folgenden Algorithmus (Pseudocode) implementieren:

String xml = ... 
stack = new Stack() 

while True: 

    tag = extractNextTag(xml) 

    // no new tag is found 
    if tag == null: 
     break 

    if (tag.isOpening()): 
     stack.push(tag.name) 
    else: 
     oldTagName = stack.pop() 
     if (oldTagName != tag.name): 
      error("Open/close tag error") 
if ! stack.isEmpty(): 
    error("Open/close tag error") 

Sie Funktion extractNewTag mit 10-20 Zeilen Code mit einigen knowled über Parser oder einfach nur das Schreiben einfachen regulären Ausdrucks umsetzen können. Natürlich müssen Sie bei der Suche nach einem neuen Tag mit der Suche nach dem Symbol beginnen, das auf das letzte gefundene Tag folgt.

Verwandte Themen