분산형 차트 채점시 꺾은선형도 채점 허용하도록 변경
This commit is contained in:
@@ -68,7 +68,7 @@ def convert_hwp_to_xml(input_folder, output_folder):
|
||||
input_path = Path(input_folder)
|
||||
|
||||
# for hwp_file in input_path.glob("DIW_2503B.hwpx"):
|
||||
for hwp_file in chain(input_path.glob("*.hwp"), input_path.glob("*.hwpx")):
|
||||
for hwp_file in chain(input_path.glob("DIW-006787-권연호.hwp"), input_path.glob("*.hwpx")):
|
||||
try:
|
||||
# 파일 열기
|
||||
if hwp_file.suffix == ".hwpx":
|
||||
@@ -174,10 +174,10 @@ if __name__ == "__main__":
|
||||
for exam_round in exam_rounds:
|
||||
folders = [
|
||||
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\A\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\A\\DIW"),
|
||||
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\B\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\B\\DIW"),
|
||||
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\DIW"),
|
||||
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\D\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\D\\DIW"),
|
||||
(f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\E\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\E\\DIW"),
|
||||
# (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\B\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\B\\DIW"),
|
||||
# (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\C\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\C\\DIW"),
|
||||
# (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\D\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\D\\DIW"),
|
||||
# (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}\\E\\DIW",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}\\E\\DIW"),
|
||||
|
||||
# (f"D:\\project\\HWP\\HWP-Scoring\\input\\{exam_round}",f"D:\\project\\HWP\\HWP-Scoring\\output\\{exam_round}"),
|
||||
]
|
||||
|
||||
@@ -778,7 +778,7 @@
|
||||
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
|
||||
},
|
||||
"53": {
|
||||
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface",
|
||||
"chart_xpath": "//c:catAx/c:txPr//a:ea/@typeface | //c:catAx/c:txPr//a:latin/@typeface",
|
||||
"value": "바탕",
|
||||
"points": 1,
|
||||
"category": "ChartOneAnswer",
|
||||
@@ -801,7 +801,7 @@
|
||||
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
|
||||
},
|
||||
"56": {
|
||||
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface",
|
||||
"chart_xpath": "//c:valAx/c:txPr//a:ea/@typeface | //c:valAx/c:txPr//a:latin/@typeface",
|
||||
"value": "바탕",
|
||||
"points": 1,
|
||||
"category": "ChartOneAnswer",
|
||||
@@ -824,7 +824,7 @@
|
||||
"desc": "option값 - 기울임(Italic):i / 굵게(Bold):b"
|
||||
},
|
||||
"59": {
|
||||
"chart_xpath": "//c:legend//a:ea/@typeface",
|
||||
"chart_xpath": "//c:legend//a:ea/@typeface | //c:legend//a:latin/@typeface",
|
||||
"value": "바탕",
|
||||
"points": 1,
|
||||
"category": "OneAnswer",
|
||||
|
||||
@@ -1,52 +0,0 @@
|
||||
import os
|
||||
import shutil
|
||||
import unicodedata
|
||||
|
||||
def copy_dic_subdirs(source_root, target_root_a, target_root_b, target_root_c, target_root_d, target_root_e):
|
||||
for root, dirs, files in os.walk(source_root):
|
||||
for dir_name in dirs:
|
||||
if dir_name.lower() == 'diw': # DIW 디렉토리 탐색
|
||||
parent_dir = os.path.basename(os.path.dirname(os.path.join(root, dir_name)))
|
||||
target_root = None
|
||||
parent_dir = unicodedata.normalize('NFC', parent_dir)
|
||||
|
||||
# 부모 디렉토리가 '2교시'인지, '3교시'인지 확인
|
||||
if parent_dir == '1교시':
|
||||
target_root = target_root_a
|
||||
elif parent_dir == '2교시':
|
||||
target_root = target_root_b
|
||||
elif parent_dir == '3교시':
|
||||
target_root = target_root_c
|
||||
elif parent_dir == '4교시':
|
||||
target_root = target_root_d
|
||||
elif parent_dir == '5교시':
|
||||
target_root = target_root_e
|
||||
|
||||
if target_root:
|
||||
source_dic_path = os.path.join(root, dir_name)
|
||||
target_dir_name = dir_name.upper()
|
||||
target_dic_path = os.path.join(target_root, target_dir_name)
|
||||
|
||||
# DIC 하위 디렉토리와 파일 복사
|
||||
shutil.copytree(source_dic_path, target_dic_path, dirs_exist_ok=True)
|
||||
print(f"Copied {source_dic_path} to {target_dic_path}")
|
||||
|
||||
test_folder_path = os.path.join(target_root, "TEST")
|
||||
os.makedirs(test_folder_path, exist_ok=True)
|
||||
|
||||
|
||||
else:
|
||||
print(f"Skipping {dir_name} under {parent_dir}, as it doesn't match '2교시' or '3교시'.")
|
||||
|
||||
# 사용법
|
||||
# exam_round = "2504_2"
|
||||
exam_round = "2509"
|
||||
source_directory = r"D:\project\HWP\HWP-Scoring\회차별채점자료\2509"
|
||||
|
||||
target_directory_a = f".\\input\\{exam_round}\\A" # '1교시'의 타겟 경로
|
||||
target_directory_b = f".\\input\\{exam_round}\\B" # '2교시'의 타겟 경로
|
||||
target_directory_c = f".\\input\\{exam_round}\\C" # '3교시'의 타겟 경로
|
||||
target_directory_d = f".\\input\\{exam_round}\\D" # '4교시'의 타겟 경로
|
||||
target_directory_e = f".\\input\\{exam_round}\\E" # '5교시'의 타겟 경로
|
||||
|
||||
copy_dic_subdirs(source_directory, target_directory_a, target_directory_b, target_directory_c, target_directory_d, target_directory_e)
|
||||
@@ -1,43 +0,0 @@
|
||||
import base64
|
||||
import re
|
||||
from lxml import etree as ET
|
||||
|
||||
xml_path = r"C:\Users\dra\project\HWP-Scoring\output\워드(한글)-009866-성유나.hml"
|
||||
tree = ET.parse(xml_path)
|
||||
root = tree.getroot()
|
||||
# xpath로 바이너리 부분추출
|
||||
binary_data = root.xpath('//BINDATA[@Id=//BINITEM[@Format="OLE"]/@BinData]/text()')
|
||||
binary_data = binary_data[0].encode('utf-8')
|
||||
# 파일을 읽어들입니다.
|
||||
# with open('./chartBinData2', 'rb') as file:
|
||||
# encoded_data = file.read()
|
||||
# encoded_data 내에 존재하는 <BINDATA ...> ... </BINDATA> 태그를 찾아서 삭제
|
||||
# <BINDATA ...> 태그는 base64 디코딩을 수행할 때 오류가 발생하므로 삭제합니다.
|
||||
|
||||
# <BINDATA ...> 태그와 그 내부 내용을 삭제합니다.
|
||||
encoded_data = re.sub(b'<BINDATA.*?>', b'', binary_data)
|
||||
# encoded_data = re.sub(b'<BINDATA.*?>', b'', encoded_data)
|
||||
# print(encoded_data)
|
||||
encoded_data = encoded_data.replace(b'</BINDATA>', b'')
|
||||
encoded_data = encoded_data.replace(b'\r\n', b'')
|
||||
# print(encoded_data+b'==')
|
||||
|
||||
# base64 디코딩을 수행합니다.
|
||||
|
||||
decoded_data = base64.b64decode(encoded_data+b'==')
|
||||
|
||||
print(decoded_data)
|
||||
|
||||
# 디코딩된 데이터 내용 중 xml 형식만 추출할 때 <c:chartSpace>, </c:chartSpace> 사이의 데이터만 추출.
|
||||
start = decoded_data.find(b'<?xml')
|
||||
print(start)
|
||||
end = decoded_data.find(b'</c:chartSpace>')
|
||||
print(end)
|
||||
xml_data = decoded_data[start:end+len(b'</c:chartSpace>')]
|
||||
|
||||
# 디코딩된 데이터를 파일로 저장합니다.
|
||||
with open('ext_BinData.xml', 'wb') as file:
|
||||
file.write(xml_data)
|
||||
|
||||
|
||||
print("Decoding complete. Decoded data saved to 'decoded_chartBinData'.")
|
||||
@@ -532,6 +532,7 @@ class XMLScorer:
|
||||
|
||||
# 가로 차트일 경우에만 x축과 y축을 바꿔줌
|
||||
# 세로, 꺾은선, 원형 차트의 경우 그대로 사용
|
||||
|
||||
if "가로" in chart_type:
|
||||
if "catAx" in chart_xpath:
|
||||
chart_xpath = chart_xpath.replace("catAx", "valAx")
|
||||
@@ -543,10 +544,13 @@ class XMLScorer:
|
||||
# valAx의 axPos(축의위치) 속성값으로 축의 방향을 구분함
|
||||
elif "분산형" in chart_type:
|
||||
if "catAx" in chart_xpath:
|
||||
# valAx[c:axPos/@val='b'] : 값축의 위치가 bottom (가로,x축)
|
||||
chart_xpath = chart_xpath.replace("catAx", "valAx[c:axPos/@val='b']")
|
||||
# 분산형 차트는 catAx 대신 valAx를 사용하거나,
|
||||
# catAx를 사용하더라도 bottom 위치의 축만 해당
|
||||
xpath_with_valax = chart_xpath.replace("catAx", "valAx[c:axPos/@val='b']")
|
||||
xpath_with_catax = chart_xpath.replace("catAx", "catAx[c:axPos/@val='b']")
|
||||
# 두 경로를 OR 조건으로 결합
|
||||
chart_xpath = xpath_with_valax + " | " + xpath_with_catax
|
||||
elif "valAx" in chart_xpath:
|
||||
# valAx[c:axPos/@val='l'] : 값축의 위치가 left (세로,y축)
|
||||
chart_xpath = chart_xpath.replace("valAx", "valAx[c:axPos/@val='l']")
|
||||
|
||||
chart_items = chart_tree.xpath(chart_xpath, namespaces=namespaces) if chart_xpath else []
|
||||
@@ -1481,9 +1485,9 @@ def main():
|
||||
# 채점하고자 하는 유형은 주석 해제
|
||||
exam_types = [
|
||||
# 'A',
|
||||
# 'B',
|
||||
'B',
|
||||
# 'C',
|
||||
'D',
|
||||
# 'D',
|
||||
]
|
||||
|
||||
test_mode = False
|
||||
|
||||
@@ -31480,3 +31480,20 @@
|
||||
2026-02-13 16:17:57,932 - INFO - 폴더 변환 완료: D:\project\HWP\HWP-Scoring\input\2622\D\DIW -> D:\project\HWP\HWP-Scoring\output\2622\D\DIW
|
||||
2026-02-13 16:17:58,432 - INFO - 폴더 변환 시작: D:\project\HWP\HWP-Scoring\input\2622\E\DIW -> D:\project\HWP\HWP-Scoring\output\2622\E\DIW
|
||||
2026-02-13 16:17:59,956 - INFO - 폴더 변환 완료: D:\project\HWP\HWP-Scoring\input\2622\E\DIW -> D:\project\HWP\HWP-Scoring\output\2622\E\DIW
|
||||
2026-02-20 16:10:59,908 - INFO - 폴더 변환 시작: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:11:16,272 - INFO - 변환 성공: DIW-006787-권연호.hwp -> DIW-006787-권연호.hml
|
||||
2026-02-20 16:11:16,927 - INFO - 변환 성공: DIW_2622A.hwpx -> DIW_2622A.hml
|
||||
2026-02-20 16:11:17,276 - INFO - 폴더 변환 완료: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:11:36,896 - INFO - 폴더 변환 시작: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:11:40,978 - INFO - 변환 성공: DIW-006787-권연호.hwp -> DIW-006787-권연호.hml
|
||||
2026-02-20 16:11:41,661 - INFO - 변환 성공: DIW_2622A.hwpx -> DIW_2622A.hml
|
||||
2026-02-20 16:11:41,986 - INFO - 폴더 변환 완료: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:11:51,894 - INFO - 폴더 변환 시작: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:12:04,577 - INFO - 변환 성공: DIW-006787-권연호.hwp -> DIW-006787-권연호.hml
|
||||
2026-02-20 16:12:05,287 - INFO - 변환 성공: DIW_2622A.hwpx -> DIW_2622A.hml
|
||||
2026-02-20 16:12:05,613 - INFO - 폴더 변환 완료: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:12:07,999 - INFO - 폴더 변환 시작: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:12:37,153 - INFO - 변환 성공: DIW-006787-권연호.hwp -> DIW-006787-권연호.hml
|
||||
2026-02-20 16:12:37,748 - INFO - 변환 성공: DIW_2622A.hwpx -> DIW_2622A.hml
|
||||
2026-02-20 16:12:38,053 - INFO - 폴더 변환 완료: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
2026-02-20 16:13:37,659 - INFO - 폴더 변환 시작: D:\project\HWP\HWP-Scoring\input\2622\A\DIW -> D:\project\HWP\HWP-Scoring\output\2622\A\DIW
|
||||
|
||||
Binary file not shown.
BIN
score_result/260220_DIW_2622B_TEST.xlsx
Normal file
BIN
score_result/260220_DIW_2622B_TEST.xlsx
Normal file
Binary file not shown.
BIN
score_result/260220_DIW_2622B_채점결과.xlsx
Normal file
BIN
score_result/260220_DIW_2622B_채점결과.xlsx
Normal file
Binary file not shown.
@@ -1,63 +0,0 @@
|
||||
from hanspell import spell_checker
|
||||
from lxml import etree as ET
|
||||
import difflib
|
||||
|
||||
|
||||
# sent = ['서울시 용일동 보건소에서 주최하는 ','즐거운 컬러푸드 영양교실', '은 제8회째 진행하는 행사입니다. 조화로운 식생활과 건강한 삶을 유지하도록 음식 재료의 빛깔만큼이나 다양한 효능이 그 속에 담겨져 있는 컬러푸드에 대한 올바른 영양지식을 제공하고 지역주민들이 직접 참여하여 각각의 맛과 특징을 살펴보고 골고루 먹기의 중요성을 컬러푸드 체험을 통하여 배울 수 있습니다. 이 밖에 아이들을 위한 영양 식단과 고혈압, 당뇨, 비만예방 식단 및 컬러푸드를 이용한 영양 간식 만들기 등 다양한 프로그램이 준비되어 있습니다. 아이들에게는 좋은 경험이 될 수 있는 이번 행사에 많은 참여 부탁드립니다.']
|
||||
# spelled_check=spell_checker.check(sent)
|
||||
xml_path_origin = r"/Users/waterdrw/Works/KAIT/HWP-Scoring/output/정답.hml"
|
||||
xml_path = r"/Users/waterdrw/Works/KAIT/HWP-Scoring/output/워드(한글)-010036-구준호.hml"
|
||||
tree = ET.parse(xml_path)
|
||||
root = tree.getroot()
|
||||
tree_origin = ET.parse(xml_path_origin)
|
||||
root_origin = tree_origin.getroot()
|
||||
|
||||
# xpath로 바이너리 부분추출
|
||||
input_text = root.xpath('//CHAR/text()')
|
||||
input_text_origin = root_origin.xpath('//CHAR/text()')
|
||||
|
||||
# 각 요소에서 공백 제거
|
||||
input_text = [text.replace(' ', '') for text in input_text]
|
||||
input_text_origin = [text.replace(' ', '') for text in input_text_origin]
|
||||
|
||||
|
||||
# 리스트를 하나의 문자열로 변경
|
||||
input_text_str = ''.join(input_text)
|
||||
input_text_origin_str = ''.join(input_text_origin)
|
||||
|
||||
print("input_text as string:")
|
||||
print(input_text_str)
|
||||
print("\ninput_text_origin as string:")
|
||||
print(input_text_origin_str)
|
||||
|
||||
|
||||
# 문자열의 차이를 비교
|
||||
diff = difflib.ndiff(input_text_origin_str, input_text_str)
|
||||
diff_list = list(diff)
|
||||
|
||||
# 차이점을 정리하여 result_diff에 저장
|
||||
result_diff = []
|
||||
skip_next = False
|
||||
|
||||
for i, line in enumerate(diff_list):
|
||||
if skip_next:
|
||||
skip_next = False
|
||||
continue
|
||||
# diff_list의 line 시작이 '-'이면서 다음 line이 '+'이면 두 line을 붙여서 맞춤법이 틀린 단어로 판단
|
||||
if line.startswith('- '):
|
||||
if i + 1 < len(diff_list) and diff_list[i + 1].startswith('+ '):
|
||||
line = line.replace('- ', '-')
|
||||
next = diff_list[i + 1].replace('+ ', '')
|
||||
result_diff.append(line+'=>'+next)
|
||||
skip_next = True
|
||||
else:
|
||||
line = line.replace('- ', '-')
|
||||
result_diff.append(line)
|
||||
elif line.startswith('+ '):
|
||||
line = line.replace('+ ', '+')
|
||||
result_diff.append(line)
|
||||
|
||||
# result_diff 출력
|
||||
print("\nResult Differences:")
|
||||
for diff in result_diff:
|
||||
print(diff)
|
||||
Binary file not shown.
148
xpathSearch.py
148
xpathSearch.py
@@ -1,148 +0,0 @@
|
||||
from lxml import etree
|
||||
from difflib import SequenceMatcher
|
||||
import json
|
||||
|
||||
class XMLPathHandler:
|
||||
def __init__(self, xml_file_path):
|
||||
"""
|
||||
XML 파일을 로드하고 처리하는 핸들러
|
||||
:param xml_file_path: XML 파일 경로
|
||||
"""
|
||||
self.tree = etree.parse(xml_file_path)
|
||||
self.root = self.tree.getroot()
|
||||
|
||||
def similar(self, a, b):
|
||||
"""
|
||||
두 문자열의 유사도를 계산
|
||||
:return: 유사도 점수 (0~1)
|
||||
"""
|
||||
return SequenceMatcher(None, a, b).ratio()
|
||||
|
||||
def find_similar_text(self, search_value, element_name, arg_name, threshold=0.8):
|
||||
"""
|
||||
XML에서 유사한 텍스트를 찾음
|
||||
:param search_value: 찾고자 하는 텍스트
|
||||
:param element_name: 검색할 요소 이름
|
||||
:param arg_name: 검색할 속성 이름
|
||||
:param threshold: 유사도 임계값
|
||||
:return: 가장 유사한 텍스트와 점수
|
||||
"""
|
||||
# 특정 요소의 특정 속성을 가진 모든 요소 검색
|
||||
xpath = f"//{element_name}[@{arg_name}]"
|
||||
elements = self.root.xpath(xpath)
|
||||
best_match = None
|
||||
best_score = 0
|
||||
|
||||
for element in elements:
|
||||
attr_value = element.get(arg_name)
|
||||
if attr_value is not None:
|
||||
score = self.similar(search_value, attr_value)
|
||||
if score > threshold and score > best_score:
|
||||
best_match = attr_value
|
||||
best_score = score
|
||||
|
||||
return best_match, best_score
|
||||
|
||||
def build_xpath(self, item):
|
||||
"""
|
||||
설정 항목을 기반으로 XPath 생성
|
||||
:param item: 설정 항목
|
||||
:return: 구성된 XPath와 매칭된 텍스트, 유사도 점수
|
||||
"""
|
||||
if not all(key in item for key in ['ele', 'arg', 'searchValue']):
|
||||
return None, None, 0
|
||||
|
||||
# 유사 텍스트 검색
|
||||
matched_text, score = self.find_similar_text(
|
||||
item['searchValue'],
|
||||
item['ele'],
|
||||
item['arg']
|
||||
)
|
||||
|
||||
if matched_text:
|
||||
# 기본 XPath 템플릿 구성
|
||||
xpath = f"//{item['ele']}[@{item['arg']}='{matched_text}']"
|
||||
|
||||
# path가 제공된 경우, 해당 path를 기반으로 XPath 구성
|
||||
if 'path' in item and item['path']:
|
||||
xpath = item['path'].replace(f"[@{item['arg']}='']", f"[@{item['arg']}='{matched_text}']")
|
||||
xpath = xpath.replace(f"[@{item['arg']}='searchValue']", f"[@{item['arg']}='{matched_text}']")
|
||||
|
||||
return xpath, matched_text, score
|
||||
|
||||
return None, None, 0
|
||||
|
||||
def process_config(self, config):
|
||||
"""
|
||||
설정된 JSON 설정을 처리
|
||||
:param config: JSON 설정
|
||||
:return: 처리된 XPath 결과들
|
||||
"""
|
||||
results = {}
|
||||
|
||||
for key, item in config.items():
|
||||
results[key] = {
|
||||
'original_config': item,
|
||||
'processed_results': {}
|
||||
}
|
||||
|
||||
xpath, matched_text, score = self.build_xpath(item)
|
||||
|
||||
if xpath:
|
||||
try:
|
||||
xpath_results = self.root.xpath(xpath)
|
||||
results[key]['processed_results'] = {
|
||||
'original_value': item['searchValue'],
|
||||
'matched_value': matched_text,
|
||||
'similarity_score': score,
|
||||
'xpath': xpath,
|
||||
'results': xpath_results
|
||||
}
|
||||
except etree.XPathEvalError as e:
|
||||
results[key]['error'] = f"XPath evaluation error: {str(e)}"
|
||||
else:
|
||||
results[key]['error'] = "Unable to build XPath: missing required configuration"
|
||||
|
||||
return results
|
||||
|
||||
# 사용 예시
|
||||
def main():
|
||||
config = {
|
||||
"0": {
|
||||
"path": "//TEXTART[@Text='']/TEXTARTSHAPE/@FontName",
|
||||
"ele": "TEXTART",
|
||||
"arg": "Text",
|
||||
"searchValue": "즐거운컬러푸드영양교실",
|
||||
"value": "궁서체",
|
||||
"points": 10
|
||||
},
|
||||
"1": {
|
||||
"path": "//PARASHAPE[@Id=//TEXTART[@Text='']/ancestor::P/@ParaShape]/@Align",
|
||||
"ele": "PARASHAPE",
|
||||
"arg": "Align",
|
||||
"searchValue": "Center",
|
||||
"value": "Center",
|
||||
"points": 2
|
||||
}
|
||||
}
|
||||
|
||||
xmlPath = r"C:\Users\dra\project\HWP-Scoring\output\1.hml";
|
||||
handler = XMLPathHandler(xmlPath)
|
||||
results = handler.process_config(config)
|
||||
|
||||
# 결과 출력
|
||||
for key, result in results.items():
|
||||
print(f"\nProcessing config item {key}:")
|
||||
print(f"Original config: {result['original_config']}")
|
||||
|
||||
if 'error' in result:
|
||||
print(f"Error: {result['error']}")
|
||||
else:
|
||||
processed = result['processed_results']
|
||||
print(f"Generated XPath: {processed['xpath']}")
|
||||
print(f"Matched text: {processed['matched_value']}")
|
||||
print(f"Similarity score: {processed['similarity_score']}")
|
||||
print(f"Results found: {processed['results']}")
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
13
오류및문제점.md
13
오류및문제점.md
@@ -1,13 +0,0 @@
|
||||
# 오류 및 문제점
|
||||
|
||||
## 1. 원인 파악이나 해결이 어려운 경우
|
||||
|
||||
### 한글문서(.hwpx)에 수험자가 차트 텍스트 속성을 변경해서 저장했지만 차트 xml파일에 옵션이 적용되지 않는 경우가 있음
|
||||
|
||||
#### (2-50) 문항 차트 제목 굵게 속성만
|
||||
|
||||
1. 정상적으로 텍스트 속성이 적용되는 수험자의 차트를 복사
|
||||
2. 텍스트 속성이 적용되지 않는 수험자의 한글 파일에 차트를 붙여넣을 경우
|
||||
3. 정상적으로 XML파일에 텍스트 속성이 적용
|
||||
|
||||
- 이로 미루어 볼 때, 차트객체의 문제일 것으로 판단되지만 해결 방안은 현재 없음
|
||||
Reference in New Issue
Block a user