문서 형식 문제 해결 어머니의 목록에는 수백 개는 아니더라도 수십 개의 요리법이 있습니다. 치명적인 오류가 발생하면 디버깅이 매우 어려워집니다. 누락된 마커를 한 줄씩 검색하게 됩니다. 여러 수준의 중첩을 사용하면 오류를 찾기가 어렵습니다.
그러나 좋은 도움을 찾을 수 있습니다. 파서 - XML 코드를 구문 분석하고 잘못된 오류를 보고하는 응용 프로그램은 온라인에서 무료로 사용할 수 있습니다. 이들 중 최고는 XML 사양의 기술 편집자이자 옹호자이며 지구상에서 가장 똑똑한 사람 중 한 명인 Tim Bray가 작성한 Lark입니다.
저는 Lark를 사용하여 아래 코드를 분석하고 있습니다. "초콜릿 칩"과 닫는 태그가 </ingredients> 태그 내의 잘못된 위치에 나타납니다.
<?xml version="1.0"?>
<list>
<recipe>
<author>Carol Schmidt</author>
<recipe_name >초콜릿 칩바</recipe_name>
<meal>저녁
<course>디저트</course>
</meal>
<ingredients>
<item>버터 2/3C</item>
<item>황설탕 2C</ item>
<item>바닐라 1티스푼</item>
<item>체로 치지 않은 다용도 밀가루 1 3/4C</item>
<item>베이킹 파우더 1 1/2티스푼</item>
<item>소금 1/2티스푼< /item>
<item>계란 3개</item>
<item>다진 견과류 1/2C</item>
<item>
</ingredients>달콤한 초코칩 2컵(12oz pkg.)
</item >
<사용법>
버터
를 녹인 후
큰 믹싱볼에 넣고
따로 보관해 두세요
.. 미리 준비해 둔 건조
재료, 견과류, 칩을
기름칠한 13x9인치 팬에 넣고 노릇
노릇해질 때까지
굽습니다.</directions>
</recipe>
</ list>
다음은 분석기에서 반환된 결과입니다.
오류 보고서
17행, 22열: 발생 </ingredients> 예상 </item>
... 가정 </item>
18행, 36열: 발생 </item> 시작 태그가 없습니다.
이 정보를 사용하면 오류를 찾는 것이 문제가 되지 않습니다. 그렇다면 XML 파일의 유효성은 무엇을 의미합니까?
효율성 구현 궁극적으로 우리는 잘 구성된 XML 문서에 정보를 추가할 것입니다. 사실 할 일이 많고 아직 위기가 도사리고 있고 XML 파일은 잘 정리되어 있지만,
그러나 중요한 정보도 손실될 수 있습니다. 다음 예를 살펴보세요.
<레시피>
<저자>캐롤 슈미트</저자>
<recipe_name>초콜릿칩바</recipe_name>
<meal>저녁 <course>디저트</course> </meal>
<재료> </재료>
<directions>버터를 녹이고 다른 재료와 결합하세요. ... </directions>
</레시피>
이 레시피에는 재료가 들어가지 않고, 구성이 너무 잘 되어있어서,
Lark 분석기도 문제를 찾지 못합니다. 가장 온건한 데이터베이스라도 관리해 본 사람이라면 인간이 저지르는 실수를 알고 있습니다. 기회가 주어지면 중요한 정보를 버리고 쓸데없는 말도 안 되는 내용을 추가합니다. 이것이 바로 XML 창시자가 DTD를 도입한 이유입니다.
문서 유형 정의. DTD는 XML이 원하는 대로 되도록 보장하는 방법을 제공합니다.
레시피에 사용되는 DTD를 살펴보겠습니다.
<!DOCTYPE 목록 [
<!ELEMENT 레시피(레시피_이름, 작성자, 식사, 재료, 사용법)>
<!ELEMENT 재료(항목+)>
<!ELEMENT 식사(#PCDATA, 코스?)>
<!ELEMENT 항목(#PCDATA, sub_item*)>
<!ELEMENT 레시피_이름(#PCDATA)>
<!ELEMENT 작성자(#PCDATA)>
<!ELEMENT 코스(#PCDATA)>
<!ELEMENT 항목(#PCDATA)>
<!ELEMENT 하위 항목(#PCDATA)>
<!ELEMENT 방향(#PCDATA)>
]>
코드는 처음에는 친숙하지 않은 것처럼 보일 수 있지만, 분석해 보면 의미가 있습니다. 자세히 설명하자면:
<!DOCTYPE list [
이 줄은 대괄호로 묶인 내용이 루트 요소 <list>를 가진 문서임을 나타냅니다.
DTD. 앞서 언급했듯이 루트 요소에는 다른 모든 요소가 포함됩니다.
<!ELEMENT recipe (recipe_name, 식사, 재료, 방향)>
이 줄은 <recipe> 태그를 정의합니다. 괄호는 4개의 태그가 <recipe> 태그에 순서대로 나타나야 함을 의미합니다.
<!ELEMENT 식사 (#PCDATA, 코스?)>
이 줄에 대한 자세한 설명이 필요합니다. 나는 다음과 같은 구조를 정의했습니다:
<meal>여기서 식사 이름은 필수입니다.
<course>하나의 강좌명이 나타날 수 있으나 그렇지 않습니다.
필수</course>
</식사>
제가 이렇게 생각하는 이유는 점심이 꼭 특정한 요리일 필요는 없지만 저녁은 전채 요리, 메인 코스, 디저트를 가리킬 수 있기 때문입니다. 지정하여
#PCDATA - 이 기능을 구현하기 위해 구문 분석된 문자 데이터(즉, 이진이 아닌 데이터)를 나타냅니다. 여기서 #PCDATA는 텍스트입니다(예: "저녁 식사").
"course" 뒤의 물음표는 <meal>에 0 또는 1쌍의 <course> 태그가 나타남을 나타냅니다.
마커 내에서.
이제 다음 줄을 살펴보겠습니다.
<!ELEMENT Ingredients (item+)>
여기서 더하기 기호는 <item> 태그 쌍이 <ingredients>에 나타나야 함을 나타냅니다.
마커 내에서.
우리가 관심 있는 마지막 줄은 다음과 같습니다.
<!ELEMENT item (#PCDATA, sub_item*)>
저는 보안 조치로 sub_item*을 넣었습니다. 각 항목의 텍스트를 묻는 것 외에도 각 항목의 내용량을 계산하고 싶습니다. 별표는 <item> 태그에 포함될 수 있는 하위 항목의 수를 나타냅니다. 초콜릿 칩바 레시피에는 하위 항목이 필요하지 않지만 재료가 복잡할 때 유용합니다.
이제 이것을 종합하고 우리가 무엇을 얻는지 봅시다.
DTD의 완전한 예 아래는 완전한 예입니다. 파일에 다른 레시피를 추가해서 추가했어요
DTD에 주석이 추가됩니다. 두 번째 레시피에서는 하위 아이템을 사용한 것을 확인할 수 있습니다.
<?xml 버전="1.0"?>
<!--처음 네 줄의 문서 구조가 시작됩니다-->
<!DOCTYPE 목록 ][
<!ELEMENT 레시피(레시피_이름, 작가, 식사, 재료, 조리법)>
<!ELEMENT 재료(항목+)>
<!ELEMENT 식사(#PCDATA, 코스?)>
<!ELEMENT 항목(#PCDATA, sub_item*)>
<!--레시피 태그의 나머지 요소입니다 -->
<!ELEMENT 레시피_이름(#PCDATA)>
<!ELEMENT 작성자(#PCDATA)>
<!ELEMENT 방향(#PCDATA)>
<!--식사 태그의 나머지 요소 -->
<!ELEMENT 코스(#PCDATA)>
<!--아이템 태그의 나머지 요소 -->
<!ELEMENT 하위 항목(#PCDATA)>
]>
<?xml 버전="1.0"?>
<목록>
<레시피>
<저자>캐롤 슈미트</저자>
<recipe_name>초콜릿칩바</recipe_name>
<식사>저녁
<course>디저트</course>
</식사>
<성분>
<item>버터 2/3C</item>
<item>황설탕 2C</item>
<item>바닐라 1티스푼</item>
<item>체로 치지 않은 다용도 밀가루 1 3/4 C</item>
<item>베이킹파우더 1 1/2티스푼</item>
<item>소금 1/2티스푼</item>
<item>계란 3개</item>
<item>다진 견과류 1/2C</item>
<item>약간 달콤한 칩 2컵(12온스 포장)</item>
</재료>
<방향>
오븐을 350도로 예열하세요. 버터를 녹입니다.
큰 믹싱볼에 흑설탕과 바닐라를 넣고 섞으세요.
밀가루, 베이킹파우더, 소금을 섞어서 식혀주세요.
따로 보관하십시오. 식힌 설탕 혼합물에 계란을 추가하십시오.
미리 준비해 둔 건조 재료, 견과류, 칩을 넣고 저어주세요.
기름칠된 13x9인치 팬에 펼칩니다.
황금빛 갈색이 될 때까지 25~30분간 굽습니다.
정사각형으로 자릅니다.
</방향>
</레시피>
<레시피>
<recipe_name>토마토 소스 파스타</recipe_name>
<식사>저녁
<course>앙트레</course>
</식사>
<성분>
<item>스파게티 1파운드</item>
<item>1 16온스 토마토 캔 깍둑썰기</item>
<item>마늘 4쪽</item>
<item>다진 양파 1개</item>
<item>이탈리안 시즈닝
<sub_item>오레가노</sub_item>
<sub_item>바질</sub_item>
<sub_item>으깬 고추</sub_item>
</item>
</재료>
<방향>
파스타를 삶아 마늘과 양파를 볶습니다.
토마토를 추가하세요.뜨겁게 드세요.
</방향>
</레시피>
</list>
이제 DTD가 있으므로 문서가 DTD에서 설정한 제한 사항을 준수하는지 확인합니다. 즉, 우리는 문서의 유효성을 보장하고 싶습니다.
이를 달성하려면 유효성 분석기라는 또 다른 도구가 필요합니다. Java 기반 프로그램인 Microsoft의 MSXML은 사용하기 쉽고 잘 작동합니다. 위 문서는 본 프로그램으로 확인한 결과 오류가 발견되지 않았습니다. 하지만 내가 확인해 보면
재료 태그에 항목이 포함되지 않은 레시피는 다음 메시지를 반환합니다:
재료가 예상되는 요소 [항목]이 아닙니다.