2011-03-01 6 views
0

안녕하세요 여러분, 주어진 HTML 문서가 잘 형성되었는지 확인해야합니다.
Java 핵심 API 클래스 만 사용하여 간단한 구현이 필요합니다. 즉 JTIDY 또는 제 3 자와 같은 제 3 자 프로그램이 필요하지 않습니다.HTML Well-formedness 파서

사실 실제로 필요한 것은 태그 목록을 검색하는 알고리즘입니다. 열린 태그를 찾고 다음 태그가 해당 닫는 태그가 아니면 다음 태그로 닫는 태그를 가져야하는 다른 열린 태그 여야하며 그렇지 않은 경우 열린 태그 여야합니다. 그 다음에 해당 닫는 태그, 그리고 목록에서 다른 태그가 차례로 나오는 순서로 이전에 열린 태그의 닫는 태그가 역순으로 나타납니다. 리스트가이 순서에 준거하고있는 경우는 true를 돌려 주어, 그렇지 않은 경우는 false를 돌려줍니다. 이미 태그를 닫기 태그로 변환하는 메소드를 작성했습니다.

다음은 이미 작업을 시작한 스켈레톤 코드입니다. 너무 깔끔하지는 않지만, 내가하는 일에 대한 기본 아이디어를 제공해야합니다.

public boolean validateHtml(){ 

    ArrayList<String> tags = fetchTags(); 
    //fetchTags returns this [<html>, <head>, <title>, </title>, </head>, <body>, <h1>, </h1>, </body>, </html>] 

    //I create another ArrayList to store tags that I haven't found its corresponding close tag yet 
    ArrayList<String> unclosedTags = new ArrayList<String>(); 

    String temp; 

    for (int i = 0; i < tags.size(); i++) { 

     temp = tags.get(i); 

     if(!tags.get(i+1).equals(TagOperations.convertToCloseTag(tags.get(i)))){ 
      unclosedTags.add(tags.get(i)); 
      if(){ 

      } 

     }else{ 
      return true;//well formed html 
     } 
    } 

    return true; 
} 
+4

타사 라이브러리를 사용하는 것이 좋습니다. 이것이 학문적 인 운동이 아니라면 시간 가치가 없습니다. 가장자리 사건? '
', 자기 닫는 태그, 다른 doctypes ... –

+1

가능한 중복 [Java에서 HTML의 유효성을 검사하는 방법?] (http://stackoverflow.com/questions/4392505/how-to-validate-html-from- java) –

+2

나는 당신이 이미 숙제에 어떤 노력을 기울인 것을 알고 있습니까? 잘 했어! 그러나 우리는 "da codez"를 보내지 않으려 고합니다. 알고리즘을 완료하는 것보다 우리가 도울 수있는 구체적인 질문이 있습니까? –

답변

0

두 가지 생각. 첫째로 어쩌면 당신은 HTML에 XML 파서를 사용하여 도망 갈 수 있을까요? 잠재적으로 쉽고 훨씬 더 적은 시간이 소요됩니다.

나는 이것에 전체적인 생각을 두지는 않았지만 나에게는 재귀처럼 들리 겠지만 스택은 갈 길이다. 비슷한 것

public myClass(String htmlInput) 
{ 
    openedTags = new Stack<String>(); 
    this.htmlInput = htmlInput; 
} 
public boolean validate() 
{ 
    return validate(this.htmlInput); 
} 
private boolean validate(String html) 
{ 
    boolean result = true; 
    String curTag; 
    while(htmlLeft)  //worker loop 
    { 

     if(isOneOffTag(curTag))     //matches <tags /> 
      continue; 
     else if(isOpenTag(curTag))    //matches <tags> 
     { 
      openedTags.push(curTag); 
      if(!validate(innerHtml)) 
       return false; 
     } 
     else if(isCloseTag(curTag))    //matches </tags> 
     { 
      String lastTag = (String)openedTags.peek(); 
      if(!tagIsSimiliar(curTag, lastTag)) 
       return false; 
      openedTags.pop(); 
     } 
    } 


    return result; 
} 
private String nextTag(){return null;} 
private boolean isOpenTag(String tag){ return true;} 
private boolean isCloseTag(String tag){ return true;} 
private boolean isOneOffTag(String tag){ return true;} 
private boolean tagIsSimiliar(String curTag, String lastTag){return true;} 

* 편집 1 : 아마도 스택에 푸시해야합니다.

** 편집 2 : 여기서 부울 값을 반환 할 때 어디에서 문제를 해결할 것인지 결정하는 것이 좋습니다. 이렇게하면 포인터가 필요하기 때문에 중단 한 부분을 알 수 있습니다. 내가 생각하는 아이디어는 여전히 효과가있을 것이다.

+0

참고로, 일회용 태그의 일반적인 용어는 "자체 폐쇄 태그"입니다. –

+0

hmmn, 여기는 당신이 개발 한 재미있는 알고리즘입니다. 그래서 빨리, 멋지게, 나는 당신이 여기서 무엇을하려고하는지 이해하기 시작하고 있다고 생각합니다. 그러나 나는 'htmlLeft'와 'innerHtml'이라는 용어로 무엇을 의미하는지 이해하지 못합니다. – kooldave98

+0

흠. 그래, 나는 이것에 충분한 시간을 보낸다라고 생각하지 않는다. html은 구문 분석 할 HTML이 남아있는 한 계속 실행되는 외부 작업 루프입니다. 나는 너에게이 일을 맡길거야. innerHtml은 C 언어에서 픽업 한 용어입니다. 을 참조하면 this는 innerHtml입니다. 문제는 내부 HTML을 전달하는 것일뿐입니다. 그러면 더 많은 노력이 필요합니다. 잘못된 innerhtml을 통과했다면 정교한 체크 시스템을 사용해야 보상 할 수 있습니다. 재귀를 제거하면 정상적으로 작동합니다. 방금 재귀 아이디어를 좋아했습니다. – Highstead