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
-
(•́ ✖ •̀)
알 수 없는 사용자
댓글 입력