最近在做一个BizTalk项目,对XML文件的处理很复杂。本来是想找有没有方法可以一次性去除XML文件中节点和属性的值的空格。但是找了很久没有看到相关的方法。如果有知道该方法的麻烦跟我讲一下:cbcye@live.com 不过下面我整理了一下与之相关的XML空白字符(WhiteSpace)。

先来看看这个问题比较一下这两个XML是否一样?

XML(一)

<AddBook>

  <Name/>

  <Mobile/>

</AddBook> 

XML(二)

<AddBook><Name/><Mobile/></AddBook> 

如果你觉得一样的话,那么我们来进行如下。我们使用的是XSLT(XML转换语言)读取整个XML文档。此XSLT文件的作用是拷贝整个源XML文档中的节点到目标XML文件中。


<?xml version="1.0" encoding="UTF-8" ?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="node()">

    <xsl:copy>

      <xsl:apply-templates select="node()"/>

    </xsl:copy>

  </xsl:template>

</xsl:stylesheet> 

测试时在Visual Studio的XSLT调试界面设置断点。在监视窗口使用Xpath函数:node()来查看XML文档中的节点变化情况。

XML(一)的节点:

XML(二)的节点:

从以上的测试数据可以看出当XML处于不同行的时候XML会多一些类型为whitespace的节点。由此可见XML(一)与XML(二)是不相同的。那
为什么它们之间不相同呢?那为什么我们使用IE之类的XML解析器打开两个文件的话看到的效果是一样的?当然我们这里不讨论IE之类的是如何处理的(事实
上是我也不知道IE是如何处理的:)。我们主要来看看这两个XML之间为什么不一样。也就是本文要涉及的Whitespace。

首先我们来了解一下在XML里什么叫WiteSpace。XML 将以下四种字符归为空白字符:回车符(\r 或 ch(13))、换行符(\n 或 ch(10))、制表符 (\t) 以及空格 (' ')。在 XML 文档中,空白字符分为两类:
有意义空白字符 是文档内容的一部分,应予以保留。
无意义空白字符 在编辑 XML 文档时使用,以增加可读性。这些空白字符一般在文档交付时不予保留。

由此可见XML文档有时根据处理需要会增加一些回车、换行之类的特殊字符。但是如果这些字符在处理XML时不先清除(如果有必要的话)。那么就会造成一些
错误。比如在XSLT文件中有如下表达式的话那么XML文件中的空白字符就有可能引用转换处理错误。因为空白字符是不能作为节点名称的。

<xsl:element name="{local-name()}">

了解了XML文件中有无空白字符的区别与XML文件中空白字符的用处之后我们来了解一下XML处理器是如果处理空白字符的。该如何根据需要处理空白字符。

XML 分析:XML 规范提供了一个内置属性 xml:space 来告知 XML
分析器其是否应忽略空白字符。该属性由其根元素的子元素来继承。声明时,必须将其指定为枚举类型,其可能的值只能是“default”和
“preserve”。如果指定为“preserve”,则所定义元素内的空白字符必须保留。

示例:

  • XML数据

<?xml version="1.0" encoding="utf-8"?>

<root xmlns="http://quicklearn.cn"/>

  <part1>

    <ns0:books xmlns:ns0="http://books.quicklearn.cn"/>

      <ns0:book>

        <name>BizTalk Develop</name>

        <ISDN>0101010101010</ISDN>

      </ns0:book>

    </ns0:books>

  </part1>

  <part2>

    <ns1:customers xmlns:ns1="customers.quicklearn.cn">

      <customer xml:space="preserve">

        <name>Zhang San</name>

        <mobile>133333333333</mobile>

        <address>

          <province>Guang Dong</province>

          <city>Shen Zhen     </city>

        </address>

      </customer>

    </ns1:customers>

  </part2>

</root>
  • C#代码
XmlDocument xmlDoc = new XmlDocument();

xmlDoc.PreserveWhitespace = false;

xmlDoc.Load(@"D:\Projects\Temp\XSLTTest\XSLTTest\XSLTTest\XMLData2.xml");

this.richTextBox1.Text = xmlDoc.OuterXml;
  • 输出效果

<?xml version="1.0" encoding="utf-8"?><root xmlns="http://quicklearn.cn"/><part1><ns0:books xmlns:ns0="http://books.quicklearn.cn"/><ns0:book><name>BizTalk Develop</name><ISDN>0101010101010</ISDN></ns0:book></ns0:books></part1><part2><ns1:customers xmlns:ns1="customers.quicklearn.cn"><customer xml:space="preserve">

        <name>Zhang San</name>

        <mobile>133333333333</mobile>

        <address>

          <province>Guang Dong</province>

          <city>Shen Zhen     </city>

        </address>

      </customer></ns1:customers></part2></root>

XSLT 转换。W3C XSLT 规范提供了两个元素(即 xsl:strip-space 和
xsl:preserve-spacea€”)来处理空白字符。xsl:strip-space
指定了应删除空白字符文本节点(即文本节点完全由空白字符组成)的 XML 元素。请注意,xsl:strip-space
只有影响纯空白字符的节点。xsl:strip-space 可以列为一组由空白字符或使用通配符(例如
*)隔开的元素。xsl:preserve-space 具有类似的语法,但执行的结果却与 xsl:strip-space 正好相反。

使用方法:在XSLT文件声明全局属性 <xsl:strip-space elements="*"/>或 <xsl:strip-space elements="element1 element2…"/>

输出的效果与XML分析器相同。

总结

了解了XML空白字符的作用及XML分析与处理器处理方式。那么在处理XML空白字符字符的时候,如果XML是给后台应用程序处理的话在处理之前最好先去除XML空白字符。如果XML是给用户阅读的话则保留相关的空白字符。

BizTalk开发系列(十四) XML空白字符(WhiteSpace)的更多相关文章

  1. BizTalk开发系列(十六) XML命名空间

    BizTalk开发过程中如果有对XML进行开发操作,比如在自定义代码里操作XML消息或者在Mapping的时候使用Xpath对XML进行操 作.则有机会遇到XML命名空间的问题.常见的是使用Xpath ...

  2. BizTalk开发系列(十八) 使用信封拆分数据库消息

    之前写了一篇的<BizTalk开发系列(十七) 信封架构(Envelop)> 是关于信封架构及其拆装原理的,都是理论性的内容.信封在BizTalk开发过程中最常用的应该是在读取SQL Se ...

  3. 【Qt编程】基于Qt的词典开发系列<十四>自动补全功能

    最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行 ...

  4. BizTalk开发系列(十二) Schema设计之Group与Order

    开发BizTalk项目的时候会先约定各系统之间往来的消息格式. 由于BizTalk内部唯一使用XML文档.因此消息的格式为XML Schema(XML Schema 用于描述 XML 文档的结构).虽 ...

  5. BizTalk开发系列(十九) BizTalk命名规范

    目前BizTalk项目的开发人员比较少,但是在开发过程中还是需要命名规范的约束.根据以往BizTalk项目的经验,整理了BizTalk命 名规范.包括:BizTalk Application, Sch ...

  6. BizTalk开发系列(十五) Schema设计之Qualified 与Unqualified

    XML Schema中的命名空间前缀限定包括对元素(Element)或属性(Attribute)的限定,即常见的如 “<ns0:root>...</ns0:root>”之类的格 ...

  7. BizTalk开发系列(十) ESB Guidance安装笔记

    ESB指导工具包(ESB Guidance)是一个运行于BizTalk Server 2006 R2之上的一个框架.详细信息访问ESB指导工具包社区网站 .源码下载 ESB Guidance的安装过程 ...

  8. arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)

    前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...

  9. BizTalk 开发系列(四十一) BizTalk 2010 BAM 安装手记

    使用64位系统可以支持更大的内存,现在服务器基本上都使用64位系统.微软从Windows Server 2008 R2开始服务器版的操作系统也只支持64位了,不过对于像BizTalk这种“繁杂的东西” ...

随机推荐

  1. 制作caffe中的test.txt和val.txt

    find -name *.jpeg |cut -d '/' -f2-3> train.txt(图片在当前文件夹) find train/dog -name *.JPEG |cut -d '/' ...

  2. 仓库如何盘点 打印扫描一体PDA盘点机提升库存盘点效率

    仓库盘点是对仓储货品的收发结存等活动进行有效控制,保证仓储货品完好无损.帐物相符,确保生产正常进行,规范公司物料的盘点作业.盘点需人工操作,费时费力,PDA盘点机的出现大幅提升了盘点效率,减轻了工作人 ...

  3. mongodb 连接和操作

    使用方法: 1.安装mongodb 2.配置环境变量 mac下: export PATH=/Users/sunbey/Documents/learn/mongodb/mongodb-osx-x86_6 ...

  4. Bestcoder round #65 && hdu 5593 ZYB's Tree 树形dp

    Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submissio ...

  5. ASP.NET MVC3 中整合 NHibernate3.3、Spring.NET2.0 使用AOP执行事务处理

    方法1 <object id="ServiceOperation" type="Spring.Aop.Support.SdkRegularExpressionMet ...

  6. Regionals 2012 :: Chengdu

    题目连接 排行榜 A和I都是签到题 按位BFS K Yet Another Multiple Problem 题意:给一些可以用的数字,求最小的数,它由特定的数字组成且是n的倍数 分析:暴力枚举不可行 ...

  7. sqlserver数据库 去除字段中空格,换行符,回车符(使用replace语句)

    SQL中可以使用Replace函数来对某个字段里的某些字符进行替换操作,语法如下: 语法 REPLACE ( original-string, search-string, replace-strin ...

  8. 【原】iOS学习43即时通信之XMPP(2)

    本篇是 即时通信之XMPP(2) 接上次 即时通信之XMPP(1) 1. 好友列表 1> 初始化好友花名册 // 获取管理好友的单例对象 XMPPRosterCoreDataStorage *r ...

  9. BZOJ4623 : Styx

    $g$是积性函数,可以通过分解质因数在$O(n\log n \log\log n)$的时间内求出. 对于$((A\times B)\times C)\times D$,可以转化为$D\times (C ...

  10. 【BZOJ1864】[Zjoi2006]三色二叉树 树形DP

    1864: [Zjoi2006]三色二叉树 Description Input 仅有一行,不超过500000个字符,表示一个二叉树序列. Output 输出文件也只有一行,包含两个数,依次表示最多和最 ...