ドキュメントの形式のトラブルシューティング 母のリストには、数百とは言わないまでも、数十のレシピがあります。致命的なエラーが発生した場合、デバッグは非常に困難になります。欠落しているマーカーを 1 行ずつ検索することになります。複数のレベルのネストを使用すると、エラーを見つけるのが難しくなります。
しかし、良い助けが見つかるかもしれません。パーサー - XML コードを解析し、不正なエラーを報告するアプリケーションは、オンラインで無料で入手できます。その中で最も優れているのは、技術編集者であり、地球上で最も賢い人物の 1 人である XML 仕様の提唱者である Tim Bray によって書かれた Lark です。
以下のコードを分析するために Lark を使用しています。 「チョコレートチップ」とその終了タグが </ingredients> タグ内の間違った位置にあることに注意してください:
<?xml version="1.0"?>
<list>
<recipe>
<author>Carol Schmidt</author>
<recipe_name >チョコチップバー</recipe_name>
<meal>ディナー
<course>デザート</course>
</meal>
<材料>
<item>バター 2/3 C</item>
<item>ブラウンシュガー 2 C</ item>
<item>バニラ 小さじ 1</item>
<item>ふるわない中力粉 1 3/4 C </item>
<item>ベーキングパウダー 小さじ 1 1/2</item>
<item>塩 小さじ 1/2< /item>
<item>卵 3 個</item>
<item>刻んだナッツ 1/2 カップ</item>
<item>
</ingredients>セミスイートチョコレート
チップス 2 カップ (12 オンスパッケージ)</item> >
<作り方>
バターを350度に温め、
ブラウンシュガーとバニラを混ぜ、
冷ました砂糖混合物に卵を加えて混ぜます
。
油を塗った13×9インチの型に広げて、きつね色になるまで焼き
ます
。
</directions>
</recipe>
<
/ list>
アナライザーによって返される結果は次のとおりです。
エラー レポート
行 17、列 22: </ingredients> 予期された </item>
... と想定された </item> が発生しました
行 18、列 36: </item> が発生しましたno start-tag
この情報があれば、エラーを見つけるのは問題ありません。では、XML ファイルの有効性とは何を意味するのでしょうか?
効果の実装 最終的には、よく整理された XML ドキュメントに情報を追加します。実際には、やるべきことはたくさんあります - まだ危機が潜んでいます - XML ファイルはよく整理されていますが、
しかし、重要な情報が失われる可能性もあります。次の例を見てください:
<レシピ>
<著者>キャロル・シュミット</著者>
<recipe_name>チョコレートチップバー</recipe_name>
<食事>ディナー <コース>デザート</コース> </食事>
<材料> </材料>
<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、meal、材料、指示)>
この行は、<recipe> タグを定義します。括弧は、4 つのタグが <recipe> タグ内に順番に出現する必要があることを意味します。
<!ELEMENT Meal (#PCDATA, course?)>
この行については詳細な説明が必要です。次の構造を定義しました:
<meal>ここでは食事名は必須です
<course>コース名が 1 つ表示される場合がありますが、実際には表示されません。
必須</コース>
</食事>
私がそう考えるのは、ランチは必ずしも特定の料理である必要はないが、ディナーは前菜、メインコース、デザートを指すかもしれないからです。指定することで
#PCDATA - この機能を実装するために解析された文字データ (つまり、非バイナリ データ) を表します。ここで、#PCDATA はテキストです (例: "dinner")。
「course」の後の疑問符は、<meal> 内に 0 または 1 組の <course> タグが出現することを示します。
マーカー内。
次に、次の行を見てみましょう:
<!ELEMENT elements (item+)>
ここのプラス記号は、少なくとも 1 つの <item> タグのペアが <ingredients> に表示される必要があることを示します。
マーカー内。
私たちが注目する最後の行は次のとおりです:
<!ELEMENT item (#PCDATA, sub_item*)>
セキュリティ対策として sub_item* を入れています。各項目のテキストを要求することに加えて、各項目のコンテンツの量をカウントしたいと考えています。アスタリスクは、<item> タグに含めることができるサブ項目の数を示します。チョコチップバーのレシピにはサブアイテムは必要ありませんが、材料が複雑な場合には便利です。
では、これをまとめて何が得られるか見てみましょう。
DTD の完全な例 以下に完全な例を示します。別のレシピをファイルに追加して、
DTD には注釈が付けられます。 2 番目のレシピではサブアイテムを使用していることがわかります。
<?xml バージョン="1.0"?>
<!--これで DTD が始まります。最初の 4 行はドキュメント構造を示します-->
<!DOCTYPE リスト ][
<!ELEMENT レシピ (レシピ名、作成者、食事、材料、作り方)>
<!ELEMENT の材料 (アイテム+)>
<!ELEMENT 食事 (#PCDATA、コース?)>
<!ELEMENT アイテム (#PCDATA, sub_item*)>
<!--これらはレシピタグの残りの要素です -->
<!ELEMENT レシピ名 (#PCDATA)>
<!ELEMENT 作成者 (#PCDATA)>
<!ELEMENT の指示 (#PCDATA)>
<!--食事タグの残りの要素 -->
<!ELEMENTコース(#PCDATA)>
<!-- item タグの残りの要素 -->
<!ELEMENT サブ項目 (#PCDATA)>
]>
<?xml バージョン="1.0"?>
<リスト>
<レシピ>
<著者>キャロル・シュミット</著者>
<recipe_name>チョコレートチップバー</recipe_name>
<食事>夕食
<コース>デザート</コース>
</食事>
<成分>
<item>バター 2/3 C</item>
<item>2 C 黒砂糖</item>
<item>バニラ 小さじ 1 </item>
<item>ふるわない中力粉 1 3/4 C </item>
<item>ベーキングパウダー 小さじ 1 1/2</item>
<item>塩 小さじ 1/2</item>
<item>卵 3 個</item>
<item>刻んだナッツ 1/2 C</item>
<item>セミスイートチョコチップス 2 カップ (12 オンスパッケージ)</item>
</材料>
<行き方>
オーブンを350度に予熱し、バターを溶かします。
大きなミキシングボウルにブラウンシュガーとバニラを入れて混ぜます。
小麦粉、ベーキングパウダー、塩を混ぜて冷まします。
冷やした砂糖混合物に卵を加えてよく混ぜます。
取っておいた乾燥材料、ナッツ、チップスを加えて混ぜます。
油を塗った13×9インチの型に広げます。
きつね色になるまで25〜30分間焼きます。
正方形に切ります。
</方向>
</レシピ>
<レシピ>
<recipe_name>トマトソースのパスタ</recipe_name>
<食事>夕食
<コース>前菜</コース>
</食事>
<成分>
<item>スパゲッティ 1 ポンド</item>
<item>角切りトマト 16 オンス缶 1 個</item>
<item>ニンニク 4片</item>
<item>玉ねぎのみじん切り 1 個</item>
<アイテム>イタリアンシーズニング
<sub_item>オレガノ</sub_item>
<sub_item>バジル</sub_item>
<sub_item>砕いた赤唐辛子</sub_item>
</アイテム>
</材料>
<行き方>
パスタを茹でます。 ニンニクと玉ねぎを炒めます。
トマトを加え、温かいうちにお召し上がりください。
</方向>
</レシピ>
</リスト>
DTD が存在するので、ドキュメントが DTD によって設定された制限に準拠しているかどうかがチェックされます。言い換えれば、文書の有効性を確保したいということです。
これを達成するには、別のツール、妥当性アナライザーが必要です。 Java ベースのプログラムである Microsoft の MSXML は使いやすく、うまく動作します。上記の文書はこのプログラムによってチェックされましたが、エラーは見つかりませんでした。しかし、私がチェックすると、
材料タグに項目が含まれていないレシピは、次のメッセージを返します:
材料が予期された要素 [項目] ではありません。