2012-10-31 25 views
6

Mam plik xml tak:Jak sprawdzić otwieranie i zamykanie znaczników w pliku xml przy użyciu java?

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

Jak mogę sprawdzić, czy dla każdego znacznika otwierającego, istnieje tag kończąc? Na przykład, jeśli nie zapewni końcowy tag jako:

<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> 

Jak mogę kontynuować parsowania resztę pliku?

Próbowałem z parserem SAX jak wyjaśniono here, ale nie jest to dla mnie zbyt przydatne, ponieważ powoduje wyjątek w przypadku, gdy nie dostarczę tagu zamykającego, tak jak w drugim podanym kodzie xml.

+4

Co byś zrobił zamiast rzucać wyjątek? –

+3

dlaczego nie jest odpowiedni? możesz spróbować/wychwycić wyjątek i iść dalej. –

+1

Zamiast tego należy poprawić plik xml.Or, jeśli ktoś inny to robi, następnie poinformuj go. –

Odpowiedz

0

plik XML, który nie sprawdza swój stan „dla każdego znacznika otwierającego, jest zakończenie tag”, nie jest well formed. Aby sprawdzić, czy plik XML jest dobrze uformowany, jest pierwszym zadaniem analizatora składni XML (jest to jego pierwsze zadanie). W związku z tym potrzebny jest parser XML.

0

Samouczek, który znalazłeś, zawiera błąd. characters() może być wywołany wiele razy dla tego samego elementu (source). Właściwym sposobem oznaczania końca elementu jest reset odpowiednich stanów logicznych wewnątrz endElement(). Kod comments section zawiera wymaganą zmianę.

Po naprawieniu tego problemu można wykonać sprawdzanie błędów w startElement(), aby upewnić się, że plik nie próbuje uruchomić nieprawidłowego elementu, biorąc pod uwagę obecny stan. Pozwoli to również upewnić się, że element name znajduje się tylko wewnątrz elementu student.

0

można zaimplementować następujący algorytm (pseudo-kod):

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") 

można realizować funkcję extractNewTag z 10-20 linii kodów z wykorzystaniem niektórych knowled o parserami lub po prostu pisząc proste wyrażenie regularne. Oczywiście, gdy szukasz nowego znacznika, musisz rozpocząć wyszukiwanie od symbolu podążającego za ostatnio znalezionym znacznikiem.

Powiązane problemy