XML已经存在了很长时间:从内存来看,我猜到现在已经有12-14年了。 从计算的角度来看,它是一种成熟的产品,具有悠久的历史。 那么,有什么我可以添加到该主题的新东西吗? XML的处理方式实际上取决于您和您的情况,重点是 情况 。 在一个极端情况下,您可能会参与一个舒适的“内部”项目,其中一个内部系统必须与另一个系统对话。 在另一种极端情况下,您处于一种XML模式下,这种模式将有一天包含系统和其他国家的系统之间的对话,该系统由一组不同的开发人员编写,在遥远的国家/地区。

像往常一样,为了演示XML的不同方法,我将采用一个完全人为的和令人发指的方案,在这种情况下,您正在为Pete的Perfect Pizza 1工作 ,这是一条在大街小巷的小商店,皮特有很大的想法,他要做的第一件事就是自动将前台的订单发送到厨房,他要您编写一些代码。 您的大主意是为此使用XML,然后匆忙在纸上写下您的主意,并与Pete达成一致…

<?xml version='1.0' encoding='UTF-8'?>
<pizza><name>Capricciosa</name><base>thin</base><quantity>2</quantity>
</pizza>

Pete's是一家非常小的公司,您最终需要对前台消息生成器和厨房XML解析器代码进行编码。 这是您第一次尝试XML,并为您提供了厨房解析器代码:

public class OrderPizza {private String pizzaName;private String base;private String quantity;public void order(String xmlOrder) {pizzaName = xmlOrder.substring(57, xmlOrder.indexOf('</', 58));int index = xmlOrder.indexOf('<base>', 58);int index2 = xmlOrder.indexOf('</', index);base = xmlOrder.substring(index + 6, index2);index = xmlOrder.indexOf('<quantity>', index2);index2 = xmlOrder.indexOf('</', index);quantity = xmlOrder.substring(index + 10, index2);}public String getPizzaName() {return pizzaName;}public String getBase() {return base;}public String getQuantity() {return quantity;}}

…在单元测试中效果很好:

public class OrderPizzaTest {private static final String ORDER_XML = //'<?xml version=\'1.0\' encoding=\'UTF-8\'?>\n' + // '<pizza>\n' + //'    <name>Capricciosa</name>\n' + // '    <base>thin</base>\n' + //'    <quantity>2</quantity>\n' + //'</pizza>\n';private OrderPizza instance;@Beforepublic void setUp() throws Exception {instance = new OrderPizza();}@Testpublic void readOrderFromXML() {instance.order(ORDER_XML);assertEquals('Capricciosa', instance.getPizzaName());assertEquals('thin', instance.getBase());assertEquals('2', instance.getQuantity());}}

它上线了,一切都很好…。

时间流逝, Pete的Perfect Pizza开始扩大。 前台应用程序需要进行一些调整,Pete会加入另一个开发人员。 新开发人员要做的第一件事是确定摆脱XML消息中的空白字符并向厨房发送类似以下代码的效率更高:

<?xml version='1.0' encoding='UTF-8'?><pizza><name>Capricciosa</name><base>thin</base><quantity>2</quantity></pizza>

厨房代码很快就会掉下来,您意识到在处理XML时犯了第一个也是最基本的错误,因为XML不是STRING。 XML是一种面向对象的文档模型,可以使用字符串表示形式进行显示-这是许多人从中学习到的硬道理。 不仅是字符串的漂亮印刷可以使您绊倒,还有很多文件格式化的恶作剧还在继续。 以www.sitemaps.org为例。 该网站定义了Google,Yahoo!和Microsoft支持的XML模式,并允许网站管理员向搜索引擎通知其网站上可使用XML文档进行爬网的页面。 考虑到在模式中使用了命名空间,当要求其网站地图时,网站可以返回如下内容:

<?xml version='1.0' encoding='UTF-8'?>
<urlset xmlns='http://www.sitemaps.org/schemas/sitemap/0.9'
xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'><url><loc>http://www.example.com/</loc><lastmod>2005-01-01</lastmod><changefreq>monthly</changefreq><priority>0.8</priority></url><url><loc>http://www.example.com/page1/</loc><lastmod>2006-01-02</lastmod><changefreq>weekly</changefreq><priority>0.8</priority></url>
</urlset>

…但它同样可以返回以下内容:

<?xml version='1.0' encoding='UTF-8'?>
<sm:urlset xmlns:sm='http://www.sitemaps.org/schemas/sitemap/0.9'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'><sm:url><sm:loc>http://www.example.com/</sm:loc><sm:lastmod>2005-01-01</sm:lastmod><sm:changefreq>monthly</sm:changefreq><sm:priority>0.8</sm:priority></sm:url><sm:url><sm:loc>http://www.example.com/page1/</sm:loc><sm:lastmod>2006-01-02</sm:lastmod><sm:changefreq>weekly</sm:changefreq><sm:priority>0.8</sm:priority></sm:url>
</sm:urlset>

…或这个:

<?xml version='1.0' encoding='UTF-8'?>
<sitemap:urlset xmlns:sitemap='http://www.sitemaps.org/schemas/sitemap/0.9'
xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
xsi:schemaLocation='http://www.sitemaps.org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd'><sitemap:url><sitemap:loc>http://www.example.com/</sitemap:loc><sitemap:lastmod>2005-01-01</sitemap:lastmod><sitemap:changefreq>monthly</sitemap:changefreq><sitemap:priority>0.8</sitemap:priority></sitemap:url><sitemap:url><sitemap:loc>http://www.example.com/page1/</sitemap:loc><sitemap:lastmod>2006-01-02</sitemap:lastmod><sitemap:changefreq>weekly</sitemap:changefreq><sitemap:priority>0.8</sitemap:priority></sitemap:url>
</sitemap:urlset>

…而且它们都是有效的,等同的并且包含相同的信息。 只是它们的字符串表示形式有所不同并且放在一起,它们强调了XML的第一个规则,即XML不是STRING。

回到Pete的Perfect Pizza ,您想知道当Pete进来并要求增强功能时如何修复代码。 他希望您改进系统,以便您的XML文档一次可以订购多个披萨。 您意识到字符串处理已经出来了,并且在Internet上遇到了SAX解析,但是在另一时间却更多。

1使用Google,您会发现全球有四页的Pete's Perfect Pizza价值。 这个故事是虚构的,与它们的任何相似之处纯属巧合。
2通过阅读订单XML,您可能会猜到我最喜欢的披萨是Capricciosa,而有史以来最好的披萨可从Pizza Margherita获得

可从GitHub上获得源代码:

git://github.com/roghughe/captaindebug.git

继续阅读本系列的第2部分 。

参考: XML的方法–第1部分– XML不是字符串…来自Captain Debug博客博客中的JCG合作伙伴 Roger Hughes。

翻译自: https://www.javacodegeeks.com/2012/07/approaches-to-xml-part-1-xml-is-not.html

XML的方法–第1部分– XML不是字符串…相关推荐

  1. php xml相关函数方法,php中对xml读取的相关函数的介绍一

    对象 XML解析函数 描述 元素 xml_set_element_handler() 元素的开始和结束 字符数据 xml_set_character_data_handler() 字符数据的开始 外部 ...

  2. Android解析xml的方法,Android中解析XML格式数据的方法

    XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...

  3. T-SQL操作XML 数据类型方法 modify 的参数 1 必须是字符串文字。

    ----删除关键字的同时也清理AP表中所有关联这个ID的数据 create trigger Trg_UpdateAppWordOnDelKeyWord on [dbo].[tbl_KeyWord] f ...

  4. 一些重要的 XML DOM 方法概述

    DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法.在本章中我们将介绍一些其他重要的 XML DOM 方法. 获取元素的值 下面的实例中使用的 XML 文 ...

  5. spring 找不到applicationContext.xml解决方法

    初学Spring在用Resource rs=new ClassPathResource("applicationContext.xml");时老是遇到这个错误.后来发现用 Appl ...

  6. php数组转xml文件,php数组转换成xml格式的实现方法

    php数组转换成xml的方法:首先创建一个PHP示例文件:然后定义一个"array_Xml"方法:接着通过foreach循环遍历以及"is_array"等函数实 ...

  7. python读取xml标注坐标_遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件...

    XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...

  8. python读xml文件生成头文件_Python根据指定文件生成XML的方法

    因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...

  9. php xml 格式化,PHP实现浏览器格式化显示XML的方法示例

    本文实例讲述了PHP实现浏览器格式化显示XML的方法.分享给大家供大家参考,具体如下: 在头部加上 header("Content-type: application/xml"); ...

最新文章

  1. 腾讯云数据库客户数超50万,携手合作伙伴共建数据库生态
  2. LeetCode Lowest Common Ancestor of a Binary Tree(LCA问题)
  3. 北京交通大学2018计算机硕士录取公示,2017年北京交通大学研究生录取名单!!!...
  4. 802.11ac/ax (wifi6)中的Beamforming技术介绍
  5. 人行联网核查更新_又一批新职业公布,学互联网技术,等于站在就业“风口”...
  6. 美好生活从撸好代码开始
  7. 摄像头预览左右翻转_轻薄翻转触控本里的高性能机型:惠普ENVY x360 13评测
  8. Hexo+GitHub 快速搭建个人博客(三)---- 改变主题
  9. Two Strings(CF-223B)
  10. C++11多线程------std::async
  11. python中format函数用法简书_Python format 格式化函数
  12. centos安装mysql wsl_win10安装wsl2和docker
  13. 聚类 | Map-Equation多级网络聚类模型——InfoMap
  14. mybatis简明教程
  15. linux下安装Oracle10g RAC操作--根据[三思笔记]操作
  16. Win10修改EFI分区文件
  17. python 快乐的数字
  18. 惯性导航技术, IMU, AHRS
  19. 提高你修养的100句话
  20. Hashicorp Vault(金库)

热门文章

  1. scala中sortBy与sortWith区别
  2. 风变编程——古灵阁金币兑换
  3. 学python心得体会800字-python心得体会
  4. 基于springboot的私人健身与教练预约管理系统
  5. Win10只有飞行模式,没有WLAN图标
  6. 特斯拉车钥匙低功耗评测过程中,发现一个奇怪问题,路过的大神帮忙看看!
  7. 【Java开发】Spring Cloud 03 :Spring Boot 项目搭建
  8. oracle协议适配器错误00530,ORA-12560: TNS: 协议适配器错误的解决方法
  9. Git clone提速方法
  10. 【老生谈算法】matlab实现支持向量机的回归拟合——混凝土抗压强度预测