Python XML 파싱중 엘리먼트 순서대로 인식하게하여 조건 걸기 질문입니다.

조회수 966회

안녕하세요 파이썬으로 xml 파싱중에 있습니다. 우선 아래는 xml 예시 파일입니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<Story>
    <ParagraphStyleRange>
        <CharacterStyleRange>
            <Content>AAA</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Content>BBB</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Br />
            <Content>CCC</Content>
            <Br />
            <Content>DDD</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Content>EEE</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Br />
            <Content>FFF</Content>
            <Br />
        </CharacterStyleRange>
    </ParagraphStyleRange>
</Story>
</Root>

예시에서 각 Content 태그안에 있는 텍스트 파일들을 붙여주는 작업중입니다. 예를 들면 첫번째 Content 태그의 내용인 AAA 를 다음 Content 태그의 내용인 BBB 와 붙여주어야 합니다. 그런데 조건이 있습니다. Br 엘리먼트가 Content 태그의 바로 위에 있을시에는 이전의 Content 태그내용을 붙여주면 안됩니다.

예를 들면 첫번째 Content 태그의 내용인 AAA 를 다음 Content 태그의 내용인 BBB 와 붙여줍니다. 그리고 붙여주었으니 AAABBB 가 되었겟죠 이것을 다음 Content 태그의 내용인 CCC 에 붙여주면 안됩니다. 왜냐면 CCC Content 태그 바로 위에 Br 엘리먼트가 있기 때문입니다. Br 엘리먼트는 다른 프로그램에서 엔터값을 의미합니다.

CCC 역시 DDD 와 붙여주면 안됩니다. DDD Content 바로 위에 Br 엘리먼트가 있기 때문입니다.

DDD 는 EEE 와는 붙여주어야 합니다. 그러면 DDDEEE 가 되겟죠 그러면 이 DDDEEE 는 또 FFF 와는 붙여주면 안됩니다. FFF 바로 위에 Br 엘리먼트가 있기 때문입니다.

원하는 결과는 아래와 같습니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Root>
<Story>
    <ParagraphStyleRange>
        <CharacterStyleRange>
            <Content>AAA</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Content>AAABBB</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Br />
            <Content>CCC</Content>
            <Br />
            <Content>DDD</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Content>DDDEEE</Content>
        </CharacterStyleRange>
        <CharacterStyleRange>
            <Br />
            <Content>FFF</Content>
            <Br />
        </CharacterStyleRange>
    </ParagraphStyleRange>
</Story>
</Root>

이것을 코딩하려면 Content 태그바로 위 또는 바로 아래에 Br 엘리먼트가 있을시, <--- 이 조건문을 넣어야 할 것 같은데 이 부분을 어떻게 코딩해야 하나요?

아래는 제가 코딩중인 소스 입니다. Br 엘리먼트와 상관없이 모든 Content 의 텍스트들을 합치는 것 까지는 됩니다.(모든 텍스트가 한줄로 붙게됨)

for ParagraphStyleRange in root.findall('.//Story/ParagraphStyleRange'):
CharacterStyleRange_count = len(ParagraphStyleRange.findall('CharacterStyleRange'))
#print(CharacterStyleRange_count)
if int(CharacterStyleRange_count) >= 2 :
    try :
        Content_collect = ''
        for CharacterStyleRange in ParagraphStyleRange.findall('CharacterStyleRange'):
            for Content in CharacterStyleRange.findall('Content'):
                Content_collect += Content.text
                Content.text = str(Content_collect)
                #print(Content_collect)
                Content.text = str(Content_collect)
        #-------이 밑 부분은 텍스트를 합치고 남겨진 엘리먼트를 삭제하는 부분----------
        for CharacterStyleRange in ParagraphStyleRange.findall('CharacterStyleRange')[:-1]:
            for Content in CharacterStyleRange.findall('Content'):
                Content_remove = CharacterStyleRange.remove(Content)
    except:
        pass
  • (•́ ✖ •̀)
    알 수 없는 사용자

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)