XML的方法–第1部分– XML不是字符串…
像往常一样,为了演示XML的不同方法,我将采用一个完全人为的和令人发指的方案,在这种情况下,您正在为Pete的Perfect Pizza 1工作 ,这是一条在大街小巷的小商店,皮特有很大的想法,他要做的第一件事就是自动将前台的订单发送到厨房,他要您编写一些代码。 您的大主意是为此使用XML,然后匆忙在纸上写下您的主意,并与Pete达成一致…
![](https://3.bp.blogspot.com/-xeSfuik-Nyc/UARo8iG--jI/AAAAAAAAA_k/TQD3vzIJLcU/s400/Screen+Shot+2012-01-02+at+10.06.39.png)
<?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获得
![](https://4.bp.blogspot.com/-f-VVPN7f8AA/UARpDrNewhI/AAAAAAAAA_s/T0gYQgSELV8/s1600/shopfront.jpg)
可从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不是字符串…相关推荐
- php xml相关函数方法,php中对xml读取的相关函数的介绍一
对象 XML解析函数 描述 元素 xml_set_element_handler() 元素的开始和结束 字符数据 xml_set_character_data_handler() 字符数据的开始 外部 ...
- Android解析xml的方法,Android中解析XML格式数据的方法
XML介绍:Extensible Markup Language,即可扩展标记语言 一.概述 Android中解析XML格式数据大致有三种方法: SAX DOM PULL 二.详解 2.1 SAX S ...
- T-SQL操作XML 数据类型方法 modify 的参数 1 必须是字符串文字。
----删除关键字的同时也清理AP表中所有关联这个ID的数据 create trigger Trg_UpdateAppWordOnDelKeyWord on [dbo].[tbl_KeyWord] f ...
- 一些重要的 XML DOM 方法概述
DOM(Document Object Model 文档对象模型)定义了访问和操作文档的标准方法.在本章中我们将介绍一些其他重要的 XML DOM 方法. 获取元素的值 下面的实例中使用的 XML 文 ...
- spring 找不到applicationContext.xml解决方法
初学Spring在用Resource rs=new ClassPathResource("applicationContext.xml");时老是遇到这个错误.后来发现用 Appl ...
- php数组转xml文件,php数组转换成xml格式的实现方法
php数组转换成xml的方法:首先创建一个PHP示例文件:然后定义一个"array_Xml"方法:接着通过foreach循环遍历以及"is_array"等函数实 ...
- python读取xml标注坐标_遍历文件 创建XML对象 方法 python解析XML文件 提取坐标计存入文件...
XML文件??? xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言. 里面的标签都是可以随心所欲的按照他的命名规则来定义的,文件名为roi.xm ...
- python读xml文件生成头文件_Python根据指定文件生成XML的方法
因项目需要根据指定格式的文件生成XML标注文件,可以方便使用LabelImg打开进行编辑和查看.其原始文件默认使用逗号进行分隔,如下所示: 第1个值:原始图片中切图小文件,以AIpng_x,其中x代表 ...
- php xml 格式化,PHP实现浏览器格式化显示XML的方法示例
本文实例讲述了PHP实现浏览器格式化显示XML的方法.分享给大家供大家参考,具体如下: 在头部加上 header("Content-type: application/xml"); ...
最新文章
- 腾讯云数据库客户数超50万,携手合作伙伴共建数据库生态
- LeetCode Lowest Common Ancestor of a Binary Tree(LCA问题)
- 北京交通大学2018计算机硕士录取公示,2017年北京交通大学研究生录取名单!!!...
- 802.11ac/ax (wifi6)中的Beamforming技术介绍
- 人行联网核查更新_又一批新职业公布,学互联网技术,等于站在就业“风口”...
- 美好生活从撸好代码开始
- 摄像头预览左右翻转_轻薄翻转触控本里的高性能机型:惠普ENVY x360 13评测
- Hexo+GitHub 快速搭建个人博客(三)---- 改变主题
- Two Strings(CF-223B)
- C++11多线程------std::async
- python中format函数用法简书_Python format 格式化函数
- centos安装mysql wsl_win10安装wsl2和docker
- 聚类 | Map-Equation多级网络聚类模型——InfoMap
- mybatis简明教程
- linux下安装Oracle10g RAC操作--根据[三思笔记]操作
- Win10修改EFI分区文件
- python 快乐的数字
- 惯性导航技术, IMU, AHRS
- 提高你修养的100句话
- Hashicorp Vault(金库)
热门文章
- scala中sortBy与sortWith区别
- 风变编程——古灵阁金币兑换
- 学python心得体会800字-python心得体会
- 基于springboot的私人健身与教练预约管理系统
- Win10只有飞行模式,没有WLAN图标
- 特斯拉车钥匙低功耗评测过程中,发现一个奇怪问题,路过的大神帮忙看看!
- 【Java开发】Spring Cloud 03 :Spring Boot 项目搭建
- oracle协议适配器错误00530,ORA-12560: TNS: 协议适配器错误的解决方法
- Git clone提速方法
- 【老生谈算法】matlab实现支持向量机的回归拟合——混凝土抗压强度预测