Demo entry 6762353

asdf

   

Submitted by anonymous on Oct 12, 2018 at 23:10
Language: Python 3. Code size: 2.7 kB.

s1 = '''
<document>
<header>한글과 컴퓨터</header>
<body>
<p>한컴오피스 2018</p>
<br></br>
<p>음성인식 기능으로 말로 문서를 작성하고</p>
</br>
<p>모바일과 pc를 넘나들며 입력과 편집을 할수 있는</p>
</br>
<p>한컴오피스 2018을 만나보세요.</p>
</body>
<footer>2018-10-09</footer>
</document>
'''.strip()
    
s2 = '''
<document>
<header>한글과 컴퓨터</header>
<body>
<p>한컴오피스 2018</p>
<br></br>
<p>음성인식 기능으로 말로 문서를 작성하고</p>
</br>
<p>모바일과 pc를 넘나들며 입력과 편집을 할수 있는</p>
</br>
<p>한컴오피스 2018을 만나보세요.</p>
</body>
<footer>2018-10-09</footer>
</document>
</br>
'''.strip()
s3 = '''
<document>
<header>한글과 컴퓨터</header>
<body>
<p>한컴오피스 2018</p>
<br></br>
<p>음성인식 기능으로 말로 문서를 작성하고</p>
</br></br></br></br></br></br></br>
<p>모바일과 pc를 넘나들며 입력과 편집을 할수 있는</p>
</br></br></br></br></br></br></br>
<p>한컴오피스 2018을 만나보세요.</p>
</body>
<footer>2018-10-09</footer>
</document>
'''.strip()
def make_tag_list(s):
    '''
    주어진 문자열 s에서, tag를 추출한 리스트를 만든다
    '''
    tag_list = []
    for ele in s.split("\n"):
        if ele[0] == "<":
            tag_name = ele[1:ele.index(">")]
            tag_list.append(tag_name)
            
            close_tag = "/" + tag_name
            if close_tag in ele:
                tag_list.append(close_tag)
                
    return tag_list
  
def check_xml(tag_list):
    '''
    주어진 tag_list에서, stack을 이용하여,
    tag를 만나면 push, close_tag를 만나면 pop을 하고,
    최종적으로 stack이 비어있으면, 유효 그렇지 않으면 유효하지 않다.
    '''
    check = True
    index = 0
    stack = []
    
    while index < len(tag_list) and check:
        tag = tag_list[index]
        
        #<document> 최상위 element 검사
        if tag == 'document' and index != 0:
            check = False
        
        #<p>, <br> tag는 <body>안에만 존재 검사
        if (tag == "p" or 
            tag == "/p" or 
            tag == "br" or
            tag == "/br"):
            
            if (tag_list.index(tag) < tag_list.index("body") or 
                tag_list.index(tag) > tag_list.index("/body")):
                
                check = False
            
        if tag[0] != "/":
            stack.append(tag)
        else:
            if len(stack) == 0:
                check = False
            else:
                #열린 tag없이 </br>만 있을 때 검사
                if tag == "/br" and tag_list[index-1] != "br":
                    pass
                else:
                    stack.pop()
                    
        index += 1
        
    if check and len(stack) == 0:
        #유효함
        return True
    else:
        #유효하지 않음
        return False
    
if __name__ == '__main__':
    print(check_xml(make_tag_list(s1))) #True
    print(check_xml(make_tag_list(s2))) #False
    print(check_xml(make_tag_list(s3))) #True

This snippet took 0.01 seconds to highlight.

Back to the Entry List or Home.

Delete this entry (admin only).