像往常一样,为了演示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;
@Before
public void setUp() throws Exception {
instance = new OrderPizza();
}
@Test
public 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