<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[IE和FireFox浏览器读取XML方法比较]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Thu, 07 Jan 2010 05:32:33 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	<br/>一、IE读取XML<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var xmlDoc;<br/>&nbsp;&nbsp;<br/>&nbsp;&nbsp;xmlDoc = new ActiveXObject( &quot;Msxml2.DOMDocument&quot; );<br/>&nbsp;&nbsp;xmlDoc.loadXML(xml);<br/>//取的节点<br/>var points = xmlDoc.documentElement.getElementsByTagName(&quot;point&quot;);<br/>//取得节点的内容值<br/>points[i].childNodes[1].text<br/><br/>二<br/><br/>、firefox读取XML <br/><br/>Firefox中创建一个XML DOM，需要调用document.implementation对象的createDocument()查看有关“方法”的文章&quot;&gt;方法。该方法接受三个参数：第一个参数是包含文档所使用的命名空间URI的字符串；第二个参数是包含文档根元素名称的字符串；第三个参数是要创建的文档类型（也称为doctype）。如果要创建空的DOM文档，则代码如下所示：<br/><br/>var oXmlDom = document.implementation.createDocument(&quot;&quot;, &quot;&quot;, null);<br/><br/>前两个参数是空字符串，第三个参数为null，这样可以确保生成一个彻底的空文档。事实上，现在Firefox中并不提供针对文档类型的JavaScript支持，所以第三个参数总是为null。如果要创建包含文档元素的XML DOM，那么可以在第二个参数中指定标签名称：<br/><br/>var oXmlDom = document.implementation.createDocument(&quot;&quot;, &quot;books&quot;, null);<br/><br/>这段代码创建了一个XML DOM，其documentElement是&lt;books/&gt;。如果要创建包含指定命名空间的DOM，可以在第一个参数中指定命名空间URI：<br/><br/>var oXmlDom = document.implementation.createDocument(&quot;http://www.site1.com&quot;,<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;books&quot;, null);<br/><br/>当在createDocument()方法中指定命名空间时， Firefox会自动附上前缀a0以表示命名空间URI：<br/><br/>&lt;a0:books xmlns:a0=&quot;http://www.site1.com&quot; /&gt;<br/><br/>接着，你可以通过程序来填充XML文档，不过在一般情况下，还需要在空的XML DOM对象中载入现有的XML文档。<br/><br/>1. 在Firefox中载入XML数据<br/><br/>在Firefox中，将XML载入XML DOM的方法和微软采用的方法大致相同，只存在一个显著区别：Firefox只支持load()方法。因此，在这两种浏览器中载入外部XML数据的代码是相同的：<br/><br/>oXmlDom.load(&quot;books.xml&quot;);<br/><br/>与微软的IE一样，Firefox同样实现了async属性，该属性的行为也与其一致：将async设置为<br/>false，表示以同步模式载入文档；否则，以异步模式载入文档。<br/><br/>Firefox的XML DOM实现和微软的XML DOM实现还存在另一个不同，即Firefox不支持readyState属性及onreadystatechange事件处理函数。在Firefox中，支持load事件和onload事件处理函数。在文档完全载入后将触发load事件：<br/><br/>oXmlDom.load(&quot;books.xml&quot;);<br/><br/>oXmlDom.onload = function () {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//文档完全载入后的操作<br/><br/>};<br/><br/>正如前面所说，在Firefox的XML DOM实现中，并没有loadXML()方法，不过通过Firefox中的DOMParser类可以模拟loadXML()的行为。该类有一个名为parseFromString()的方法，用来载入字符串并解析成文档：<br/><br/>var sXml = &quot;&lt;root&gt;&lt;person&gt;&lt;name&gt;Jeremy McPeak&lt;/name&gt;&lt;/person&gt;&lt;/root&gt;&quot;;<br/><br/>var oParser = new DOMParser();<br/><br/>var oXmlDom = oParser.parseFromString(sXml,&quot;text/xml&quot;);<br/><br/>在这段代码中，创建了一个XML字符串，并作为参数传递给DOMParser的parseFromString()方法。parseFromString()方法的两个参数分别是XML字符串和数据的内容类型（一般设置为text/xml)。parseFromString()方法返回XML DOM对象，因此这里得到的oXmlDom与第一个例子相同。<br/><br/>2. 在Firefox中获取XML数据<br/><br/>尽管存在这样那样的不同，但IE和Firefox中用于获取文档中XML数据的大多数属性和方法是一致的。正如在IE中，可以使用documentElement属性来获取文档的根元素，例如：<br/><br/>var oRoot = oXmlDom.documentElement;<br/><br/>Firefox同样支持W3C标准属性，包括childNodes、firstChild、lastChild、nextSibling、nodeName、nodeType、nodeValue、ownerDocument、parentNode和previousSibling。不幸的是，对于微软专有的text和xml属性，Firefox并不支持，不过可以利用其他方法来模拟该属性的行为。<br/><br/>大家应该还记得，text属性返回了当前节点的内容，或者是当前节点及其子节点的内容。这不仅仅返回当前节点的文本，还有所有子节点的文本，因此要模拟该功能实现是十分容易的。下面这个简单的函数就能够完成该功能，该函数唯一的参数是一个节点：<br/><br/>function getText(oNode) {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var sText = &quot;&quot;;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;for (var i = 0; i &lt; oNode.childNodes.length; i++) {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (oNode.childNodes[i].hasChildNodes()) {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sText += getText(oNode.childNodes[i]);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sText += oNode.childNodes[i].nodeValue;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;}<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return sText;<br/><br/>}<br/><br/>在getText()函数中，sText变量用来保存获取的所有文本。接着对oNode的子节点使用for循环进行遍历，检查每个子节点是否包含子节点。如果有子节点，那么就将其childNode传给getText()函数，并进行同样的处理；如果没有子节点，那么将当前节点的nodeValue加到字符串中（对文本节点而言，这只是文本字符串）。处理了所有子节点后，该函数返回变量sText。<br/><br/>IE中的xml属性将存放对当前节点包含的所有XML进行序列化的结果。在Firefox中，提供了一个名为XMLSerializer对象来完成这一功能。该对象提供一个使用JavaScript可访问的serializeToString()方法，使用该方法可以对XML数据进行序列化。<br/><br/>function serializeXml(oNode) {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var oSerializer = new XMLSerializer();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;return oSerializer.serializeToString(oNode);<br/><br/>}<br/><br/>serializeXml()函数以XML节点作为参数，创建一个XMLSerializer对象，并将该节点传给serializeToString()方法。该方法将向调用者返回XML数据的字符串表示。<br/><br/>对于节点操作的DOM方法，Firefox与IE大致相同。参见“在IE中操作DOM”小节。<br/><br/>3. 在Firefox中处理错误<br/><br/>Firefox与IE的错误处理并不一样<br/>。当IE遇到错误时，它会填充parseError对象；而当Firefox遇到错误时，它会将包含错误信息的XML文档载入到XML DOM文档中。看下面的这个例子：<br/><br/>var sXml = &quot;&lt;root&gt;&lt;person&gt;&lt;name&gt;Jeremy McPeak&lt;/name&gt;&lt;/root&gt;&quot;;<br/><br/>var oParser = new DOMParser();<br/><br/>var oXmlDom = oParser.parseFromString(sXml,&quot;text/xml&quot;);<br/><br/> <br/><br/>if (oXmlDom.documentElement.tagName != &quot;parsererror&quot;) {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//没有错误发生，进行所需操作<br/><br/>} else {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;An Error Occurred&quot;);<br/><br/>}<br/><br/>在突出显示的代码行中，你会发现其中将产生一个错误：XML字符串格式不正确（因为&lt;person&gt;元素不完整，没有相应的&lt;/person&gt;元素）。当载入错误的XML时，XML DOM对象将会载入一个documentElement为&lt;parsererror/&gt;的错误文档。我们可以通过检查documentElement的tagName属性来很容易地确定是否发生错误。如果tagName属性不是parsererror，就可以确定没有发生任何错误。<br/><br/>在本例中，可能会生成如下所示的错误文档： <br/><br/>&lt;parsererror xmlns=&quot;http://www.mozilla.org/newlayout/xml/parsererror.xml&quot;&gt;XML<br/><br/>Parsing Error: mismatched tag. Expected: &lt;/person&gt;.<br/><br/>Location: http://yoda/fooreader/test.htm<br/><br/>Line Number 1, Column 43:&lt;sourcetext&gt;&lt;root&gt;&lt;person&gt;&lt;name&gt;Jeremy<br/><br/>McPeak&lt;/name&gt;&lt;/root&gt;<br/><br/>------------------------------------------^&lt;/sourcetext&gt;&lt;/parsererror&gt;<br/><br/>所有的错误信息都包含在错误文档的文本中。如果要通过程序使用这些错误信息，那么首先就要对其进行解析。最简单的方法是使用一个稍长的正则表达式：<br/><br/>var reError = /&gt;([&#92;s&#92;S]*?)Location:([&#92;s&#92;S]*?)Line Number (&#92;d+), Column<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;(&#92;d+):&lt;sourcetext&gt;([&#92;s&#92;S]*?)(?:&#92;-*&#92;^)/;<br/><br/>该正则表达式将错误文档分为五个部分：错误消息、发生错误的文件名、行号、该行中发生错误的位置，以及发生错误的源代码。使用正则表达式对象的test()方法可以使用这些信息：<br/><br/>if (oXmlDom.firstChild.tagName != &quot;parsererror&quot;) {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;//没有错误发生，进行所需操作<br/><br/>} else {<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var oXmlSerializer = new XMLSerializer();<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var sXmlError = oXmlSerializer.serializeToString(oXmlDom);<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;var reError = /&gt;([&#92;s&#92;S]*?)Location:([&#92;s&#92;S]*?)Line Number (&#92;d+), Column<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (&#92;d+):&lt;sourcetext&gt;([&#92;s&#92;S]*?)(?:&#92;-*&#92;^)/;<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;reError.test(sXmlError);<br/><br/>正则表达式捕获到的第一部分数据是错误消息，第二部分是文件名，第三部分是行号，第四部分是行内位置，第五部分是源码。你可以使用这些解析后的信息来创建自定义的错误消息：<br/><br/>var str = &quot;An error occurred!!&#92;n&quot; +<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;Description: &quot; + RegExp.$1 + &quot;&#92;n&quot; +<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;File: &quot; + RegExp.$2 + &quot;&#92;n&quot; +<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;Line: &quot; + RegExp.$3 + &quot;&#92;n&quot; +<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;Line Position: &quot; + RegExp.$4 + &quot;&#92;n&quot; +<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&quot;Source Code: &quot; + RegExp.$5;<br/><br/> <br/><br/>alert(str);<br/><br/>style=&quot;font-family: 宋体;&quot;&gt;如果发生错误，那么alert()方法会以易于阅读的格式在警告框中来显示相关的错误信息。<br/>
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] IE和FireFox浏览器读取XML方法比较]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>