xml

来源:互联网 发布:javascript hmacsha1 编辑:程序博客网 时间:2024/05/29 19:09

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

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

  XML(一)

双击代码全选
1
2
3
4
<AddBook>
 <Name/>
 <Mobile/>
</AddBook>

  XML(二)

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

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

双击代码全选
1
2
3
4
5
6
7
8
9
<?xmlversion="1.0"encoding="UTF-8"?>
<xsl:stylesheetversion="1.0"xmlns:xsl="<a href="http://www.w3.org/1999/XSL/Transform">http://www.w3.org/1999/XSL/Transform</a>">
 <xsl:outputmethod="xml"indent="yes"/>
 <xsl:templatematch="node()">
  <xsl:copy>
   <xsl:apply-templatesselect="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文件中的空白字符就有可能引用转换处理错误。因为空白字符是不能作为节点名称的。

双击代码全选
1
<xsl:elementname="{local-name()}">

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

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

  示例:

  XML数据

双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xmlversion="1.0"encoding="utf-8"?>
<rootxmlns="<a href="http://quicklearn.cn%22/">http://quicklearn.cn"/</a>>
 <part1>
  <ns0:booksxmlns:ns0="<a href="http://books.quicklearn.cn%22/">http://books.quicklearn.cn"/</a>>
   <ns0:book>
    <name>BizTalk Develop</name>
    <ISDN>0101010101010</ISDN>
   </ns0:book>
  </ns0:books>
 </part1>
 <part2>
  <ns1:customersxmlns:ns1="customers.quicklearn.cn">
   <customerxml:space="preserve">
    <name>Zhang San</name>
    <mobile>133333333333</mobile>
    <address>
     <province>Guang Dong</province>
  
     <city>Shen Zhen   </city>
    </address>
   </customer>
  </ns1:customers>
 </part2>
</root>
原创粉丝点击