QQ咨询 官方微信

添加微信好友

官方小程序

百度小程序

微信小程序

头条小程序

关于我们

XML教程

XML简易教程之二

 admin  2015-05-25 22:57:10

文档格式的排错
我妈妈_的清单中有数十条菜谱,甚至数百条。如果产生一个致命错误,排错将非常困难 - 你将一行一行地寻找丢失的标记符。如果使用几层嵌套,发现错误将很困难。

    但是可以找到很好的帮助。分析器 - xml代码和报告格式错误的应用程序可以在网上免费得到。其中最好的是Lark,它的作者是由Tim Bray - XML规范的技术编辑和极力鼓吹者,地球上最聪明的人之一。

    我用Lark分析下面的代码。注意"chocolate chips"和它的关闭标记符出现在</ingredients> 标记符中的位置有错误: 

  1. <?xml version="1.0"?> 
  2.  
  3. <list> 
  4.  
  5. <recipe> 
  6.  
  7. <author>Carol Schmidt</author> 
  8.  
  9. <recipe_name>Chocolate Chip Bars</recipe_name> 
  10.  
  11. <meal>Dinner 
  12.  
  13. <course>Dessert</course> 
  14.  
  15. </meal> 
  16.  
  17. <ingredients> 
  18.  
  19. <item>2/3 C butter</item> 
  20.  
  21. <item>2 C brown sugar</item> 
  22.  
  23. <item>1 tsp vanilla</item> 
  24.  
  25. <item>1 3/4 C unsifted all-purpose flour</item> 
  26.  
  27. <item>1 1/2 tsp baking powder</item> 
  28.  
  29. <item>1/2 tsp salt</item> 
  30.  
  31. <item>3 eggs</item> 
  32.  
  33. <item>1/2 C chopped nuts</item> 
  34.  
  35. <item> 
  36.  
  37. </ingredients>2 cups (12-oz pkg.) semi-sweet choc. 
  38.  
  39. chips</item> 
  40.  
  41. <directions> 
  42.  
  43. PReheat overn to 350 degrees. Melt butter; 
  44.  
  45. combine with brown sugar and vanilla in large mixing bowl. 
  46.  
  47. Set aside to cool. Combine flour, baking powder, and salt; set aside. 
  48.  
  49. Add eggs to cooled sugar mixture; beat well. Stir in reserved dry 
  50.  
  51. ingredients, nuts, and chips. 
  52.  
  53. Spread in greased 13-by-9-inch pan. Bake for 25 to 30 minutes 
  54.  
  55. until golden brown; cool. Cut into squares. 
  56.  
  57. </directions> 
  58.  
  59. </recipe> 
  60.  
  61. </list> 

下面是分析器返回的结果:

Error Report

Line 17, column 22: Encountered </ingredients> expected </item>

... assumed </item>

Line 18, column 36: Encountered </item> with no start-tag.

    有了这种信息,找到错误将不会成为问题。那么XML文件的有效性是指什么呢?

   实现有效性 最终我们将在组织良好的XML文档中加入信息。实际上,我们有很多事要做 - 仍然有危机潜伏 - 虽然XML文件组织良好,但还可能丢失关键信息。看看下面的例子:

  1. <recipe>  
  2. <author>Carol Schmidt</author>  
  3. <recipe_name>Chocolate Chip Bars</recipe_name>  
  4. <meal>Dinner <course>Dessert</course> </meal>  
  5. <ingredients> </ingredients>  
  6. <directions>Melt butter; combine with, etc. ... </directions> 
  7. </recipe> 

    这份菜谱中没有包含ingredient,而且因为它组织良好,所以Lark分析器也不会发现问题。管理过哪怕是最和善的数据库的人都知道我们人类常犯的错误:如果有机会,我们会丢掉关键
信息并加入无用的废话。这就是为什么XML的发明者引入DTD - 文档类型定义(Document Type Definition)。DTD提供了一种保证XML或多或少是你所想的方法。

让我们看看用在菜谱上的一个DTD。

  1. <!DOCTYPE list [  
  2. <!ELEMENT recipe (recipe_name, author, meal, ingredients, directions)>  
  3. <!ELEMENT ingredients (item+)>  
  4. <!ELEMENT meal (#PCDATA, course?)>  
  5. <!ELEMENT item (#PCDATA, sub_item*)>  
  6. <!ELEMENT recipe_name (#PCDATA)>  
  7. <!ELEMENT author (#PCDATA)>  
  8. <!ELEMENT course (#PCDATA)>  
  9. <!ELEMENT item (#PCDATA)>  
  10. <!ELEMENT subitem (#PCDATA)>  
  11. <!ELEMENT directions (#PCDATA)> 
  12. ]> 

    这些代码起初看起来不够友好,但当把它分解时却能看出其中的意义。让我们详细解释之:

<!DOCTYPE list [

    这行是说,包含在方括号中的是具有根元素<list>的某个文档的DTD。如我们以前提到的,根元素包含所有其它元素。

<!ELEMENT recipe (recipe_name, meal, ingredients, directions)>

这行定义了<recipe>标记符。圆括号是说其中的四种标记符必须按照顺序出现在<recipe>标记符中。

<!ELEMENT meal (#PCDATA, course?)>

这行需要详细的解释。我定义了以下的结构:

<meal>Here the meal name is mandatory
<course>One course name may appear, but it is not
mandatory</course>
</meal>
我这样做是因为,按照我的想法,午餐不一定特定某道菜,但是晚餐可能要指出开胃食品、主菜和餐后甜点。通过指定
#PCDATA - 表示经过分析的字符数据(即非二进制数据)来实现这个功能。这里,#PCDATA是文本 - 例如,“dinner”。

"course"后面的问号表示0或1对<course>标记符将出现在<meal>标记符内。

现在让我们看看下一行:

<!ELEMENT ingredients (item+)>

这里的加号表示至少有一对<item>标记符应出现在<ingredients>标记符内。

我们感兴趣的最后一行是:

<!ELEMENT item (#PCDATA, sub_item*)>

   我把sub_item*作为一项安全措施。除了要求每个item的文本之外,我希望计算每个item的内容的数量。星号是说在<item>标记符中可以有子条目的数目。我不需要Chocolate Chip Bars菜谱的任何子条目,但是当它的组成成分很复杂时就用得着。

现在让我们把这些放在一起看看我们能得到什么。

DTD的完整例子
   下面是一个完整的例子。我把另一个菜谱加入文件内,并为DTD做了注释。可以注意到我在第二个菜谱中用到子条目。

  1. <?xml version="1.0"?> 
  2. <!--This starts the DTD. The first four lines address document structure--> 
  3. <!DOCTYPE list ][  
  4. <!ELEMENT recipe (recipe_name, author, meal, ingredients,directions)>  
  5. <!ELEMENT ingredients (item+)>  
  6. <!ELEMENT meal (#PCDATA, course?)>  
  7. <!ELEMENT item (#PCDATA, sub_item*)>  
  8. <!--These are the remaining elements of the recipe tag -->  
  9. <!ELEMENT recipe_name (#PCDATA)>  
  10. <!ELEMENT author (#PCDATA)>  
  11. <!ELEMENT directions (#PCDATA)>  
  12. <!--The remaining element of the meal tag -->  
  13. <!ELEMENT course (#PCDATA)>  
  14. <!--The remaining element of the item tag -->  
  15. <!ELEMENT sub_item (#PCDATA)> 
  16. ]> 
  17.   
  18.  
  19. <?xml version="1.0"?>  
  20. <list>  
  21. <recipe>  
  22. <author>Carol Schmidt</author>  
  23. <recipe_name>Chocolate Chip Bars</recipe_name>  
  24. <meal>Dinner  
  25. <course>Dessert</course>  
  26. </meal> 
  27. <ingredients>  
  28. <item>2/3 C butter</item>  
  29. <item>2 C brown sugar</item>  
  30. <item>1 tsp vanilla</item>  
  31. <item>1 3/4 C unsifted all-purpose flour</item>  
  32. <item>1 1/2 tsp baking powder</item>  
  33. <item>1/2 tsp salt</item>  
  34. <item>3 eggs</item>  
  35. <item>1/2 C chopped nuts</item>  
  36. <item>2 cups (12-oz pkg.) semi-sweetchoc. chips</item>  
  37. </ingredients>  
  38. <directions> 
  39. Preheat oven to 350 degrees. Melt butter;  
  40. combinewith brown sugar and vanilla in large mixing bowl. 
  41. Set aside to cool. Combine flour, baking powder, andsalt;  
  42. set aside.Add eggs to cooled sugar mixture; beat well.  
  43. Stir in reserved dry ingredients, nuts, and chips. 
  44. Spread in greased 13-by-9-inch pan.  
  45. Bake for 25 to 30minutes until golden brown; cool.  
  46. Cut into squares.  
  47. </directions>  
  48. </recipe>  
  49. <recipe>  
  50. <recipe_name>Pasta with tomato Sauce</recipe_name>  
  51. <meal>Dinner  
  52. <course>Entree</course>  
  53. </meal>  
  54. <ingredients>  
  55. <item>1 lb spaghetti</item>  
  56. <item>1 16-oz can diced tomatoes</item>  
  57. <item>4 cloves garlic</item>  
  58. <item>1 diced onion</item>  
  59. <item>Italian seasoning  
  60. <sub_item>oregano</sub_item>  
  61. <sub_item>basil</sub_item>  
  62. <sub_item>crushed red pepper</sub_item> 
  63. </item>  
  64. </ingredients>  
  65. <directions> 
  66. Boil pasta. Sauté garlic and onion.  
  67. Add tomatoes.Serve hot.  
  68. </directions>  
  69. </recipe> 
  70. </list> 

    既然有DTD,文档将被检查看是否符合DTD做出的限制。换句话说,我们要保证文档的有效性。

为了达到这个目的,我们需要另一个工具:有效性分析器。微软的MSXML,一个基于java的程序,使用容易又工作得很好。上面的文档经过这个程序的检查后没有发现错误。但是如果我检查一个ingredient标记符中没有包含条目的菜谱,将会返回以下信息:

ingredients is not complete. Expected elements [item].

¥ 打赏
×
如果您觉得文章帮助了您就打赏一下吧
非常感谢你的打赏,我们将继续分享更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏

本文《XML简易教程之二》发布于石头博客文章,作者:admin,如若转载,请注明出处:https://www.pweb123.com/html/xml/227.html,否则禁止转载,谢谢配合!

文章点评

我来说两句 已有0条评论
点击图片更换

添加微信好友

添加微信好友

微信小程序

百度小程序