IE中的XML DOM

当微软在IE 5.0中第一次加入对XML支持时,他们只是在MSXML ActiveX库(最初是为了在IE 4.0中解析Active Channels的组件)中实现XML的功能。最初的版本并没有打算公开使用,然而随着开发人员逐渐了解这个组件并尝试使用时,微软才意识到这个库的重要性,很快就在IE 4.01中发布了MSXML完全升级版本。
MSXML最初还只是IE的一个组件。直到2001年,微软发布了MSXML 3.0,这是一个通过其公司网站独立发布的产品。在2001年晚些时候,微软又发布了MSXML 4.0,并且将其更名为微软XML核心服务组件。MSXML从最初一个基本的、无校验功能的XML解析器,逐渐发展成一个功能强大的组件,能够校验XML文档,进行XSL转化,支持命名空间、XML的简单APISAX),以及W3C XPathXML Schema标准,并且每个新版本都在性能上有一定的提升。
为了在JavaScript中创建ActiveX对象,微软实现一个新的ActiveXObject类,该类用来实例化ActiveX对象。ActiveXObject类的构造函数包含一个字符串参数,该参数表示要创建的ActiveX对象的版本,在此指的就是XML文档的版本。第一个XML DOM ActiveX对象名为Microsoft.XmlDom,其创建方法如下所示:
var oXmlDom = new ActiveXObject("Microsoft.XmlDom");
这个新创建的XML DOM对象与其他DOM对象一样,可以用来遍历DOM树,操作DOM节点。
到本书截稿为止,MSXML DOM文档共有五个不同的版本,分别是:
q  Microsoft.XmlDom
q  MSXML2.DOMDocument
q  MSXML2.DOMDocument.3.0
q  MSXML2.DOMDocument.4.0
q  MSXML2.DOMDocument.5.0
MSXML是基于ActiveX的实现,因此只能够在Windows平台上使用。在Mac平台上的IE 5是不提供XML DOM支持的。
因为存在五个不同版本,而你总是会使用最新版,所以使用一个函数来判断浏览器所使用的版本是相当有用的。这样就可以确保使用最新的XML支持,获取最佳的性能。下面的函数createDocument()将使你能够创建正确的MSXML DOM文档。
function createDocument() {
    var aVersions = [ "MSXML2.DOMDocument.5.0",
       "MSXML2.DOMDocument.4.0","MSXML2.DOMDocument.3.0",
       "MSXML2.DOMDocument","Microsoft.XmlDom"
    ];
 
      for (var i = 0; i < aVersions.length; i++) {
         try {
             var oXmlDom = new ActiveXObject(aVersions[i]);
             return oXmlDom;
         } catch (oError) {
               // 不做任何处理
      }
    }
    throw new Error("MSXML is not installed.");
}
该函数遍历存放MSXML DOM文档的版本号的aVersions数组,从最新版本MSXML2.DOMDocument.5.0开始尝试创建DOM文档。如果成功创建对象,那么返回该对象且退出createDocument();否则try...catch语句将捕获所抛出的异常,并继续下一次循环,尝试下一个版本。如果MSXML DOM文档创建失败,那么抛出异常,说明MSXML未安装。由于该函数不是一个类,所以用法与其他函数类似,都将返回一个值:
var oXmlDom = createDocument();
使用createDocument()函数将确保程序使用最新的DOM文档。当创建了XML文档后,下一步就是载入XML数据。
1. IE中载入XML数据
MSXML支持两种载入XML的方法:load()loadXML()Load()方法从Web的指定位置载入一个XML文件。与XMLHttp一样,load()方法可以以同步或异步两种模式载入数据。默认情况下,load()方法采用异步模式;如果要采用同步模式,那么必须将MSXML对象的async属性设置为false,代码如下:
oXmlDom.async = false;
当采用异步模式时,MSXML对象公开了readyState属性,该属性和XMLHttpreadyState属性一样,包含五种状态。
此外,DOM文档支持onreadystatechange事件处理函数,可以监控readyState属性。因为异步模式是默认选项,因此将async属性设置为true是可选的:
oXmlDom.async = true;
 
oXmlDom.onreadystatechange = function () {
    if (oXmlDom.readyState == 4) {
       //document完全载入后,进行某些操作
    }
};
 
oXmlDom.load("myxml.xml");
本示例中,将把虚构的、名为myxml.xmlXML文档载入到XML DOM 文档中。当readyState值为4时,说明文档已经完全载入,则执行if语句中的代码。
第二种载入XML数据的方法是loadXML(),该方法与load()方法的主要区别在于从字符串载入XML,而不是根据指定的文件名载入XML。该字符串必须包含正确格式的XML,如下所示:
var sXml = "Jeremy McPeak";
 
oXmlDom.loadXML(sXml);
在此,oXmlDom文档将载入sXml变量中包含的XML数据。loadXML()方法不需要像load()方法那样检查readyState属性,也不需要设置async属性,因为该方法并不涉及服务器请求。
2. IE中遍历XML DOM文档
XML DOM文档的遍历与HTML DOM的遍历非常类似,因为它们都是节点层次的结构。节点树的最顶部是documentElement属性,包含文档的根元素。使用表4-1中所列出的属性,可以访问文档中任何元素或属性。
4-1 XML DOM属性
   
   
attributes
包含当前节点属性的数组
childNodes
包含子节点数组
firstChild
指向当前节点的第一个子节点
lastChild
指向当前节点的最后一个子节点
nextSibling
返回当前节点的下一个邻居节点
nodeName
返回当前节点的名字
nodeType
指定当前节点的XML DOM节点类型
nodeValue
包含当前节点的文本
ownerDocument
返回文档的根元素
parentNode
指向当前节点的父节点
previousSibling
返回当前节点的前一个邻居节点
text
返回当前节点的内容或当前节点及其子节点的文本(只有IE才支持的属性)
xml
以字符串返回当前节点及其子节点的XML(只有IE才支持的属性)
遍历DOM文档并获取数据,是一个很直观的过程。让我们看看下面的XML文档:
 
    Professional Ajax
    Professional JavaScript for Web Developers
    Professional C#
    Professional Visual Basic 6 Databases
这是一个简单的XML文档,包含一个根元素以及四个子元素。以该文档为例,我们可以研究DOM的细节。DOM树是基于节点之间的关系构造的。一个节点可能包含其他节点或者子节点。另一个节点可能与其他节点拥有相同的父节点,我们称之为邻居节点。
如果要获取文档中第一个元素,那么只需简单通过访问firstChild属性就可以达到目的:
var oRoot = oXmlDom.documentElement;
 
var oFirstBook = oRoot.firstChild;
documentElement赋给变量oRoot,可以节省程序空间和输入的内容,尽管这并不是必需的。使用firstChild属性可以引用根元素的第一个子元素的引用,并将其赋值给变量oFirstBook
使用childNodes集合也可以达到相同的目的:
var oFirstBook2 = oRoot.childNodes[0];
选择childNodes集合中的第一项将返回根节点的第一个子节点。因为childNodesJavaScript中的NodeList类型,所以使用length属性可以得到子节点的数量,如下:
var iChildren = oRoot.childNodes.length;
本示例中,因为文档元素有四个子节点,所以iChildren值为4
正如前面所述,节点可以有子节点,也就意味着它可以有父节点。通过parentNode属性可以选择当前节点的父节点:
var oParent = oFirstBook.parentNode;
在本小节前面已经提到变量oFirstBook,不过很快,它现在已经是文档中第一个元素,所以其parentNode属性就是指DOMdocumentElement属性,也就是元素。
如果当前节点是book元素,那么如何选择另一个book元素呢?因为元素有共同的父节点,所以它们互为邻居关系。通过nextSiblingpreviousSibling属性可以选择当前节点的临近节点。nextSibling属性指向下一个邻居,而previousSibling属性指向前一个邻居:
var oSecondBook = oFirstBook.nextSibling;
 
oFirstBook2 = oSecondBook.previousSibling;
这段代码引用第二个元素,并将其赋值给oSecondBook。通过oSecondBook邻居节点对变量oFirstBook2重新赋值,oFirstBook2的值不变。如果节点没有下一个邻居节点,那么nextSiblingnull。对于previousSibling也是同样的,如果当前节点没有前一个邻居节点,那么previousSibling也为null
现在我们知道了如何遍历文档结构,接下来要了解的是如何从树的节点获取数据。例如,使用text属性可以得到包含第三个元素的文本,代码如下:
var sText = oRoot.childNodes[2].text;
text属性(微软特有的属性)可以得到该节点包含的所有文本节点,该属性相当有用。如果没有text属性,访问文本节点必须:
var sText = oRoot.childNodes[2].firstChild.nodeValue;
这段代码与前面使用text属性的代码一样得到同样的结果。类似上一个例子,使用childNodes集合引用第三个元素,而使用firstChild指向元素的文本节点,因为文本节点在DOM中仍是一个节点。使用nodeValue属性获取当前节点的值,就可以获取文本。
这两个示例所产生的结果是相同的,然而使用text属性和使用文本节点的nodeValue属性之间存在一个主要的区别。text属性将得到包含当前元素及其子节点的所有文本节点的值,而nodeValue属性只能得到当前节点的值。它虽然是个有用的属性,但可能会返回比预期值更多的内容。例如,假设我们将XML文档修改成:
 
 
   
        Professional Ajax
        Nicholas C. Zakas, Jeremy McPeak, Joe Fawcett
   
    Professional JavaScript for Web Developers
    Professional C#
    Professional Visual Basic 6 Databases
新的XML文档在第一个元素中添加了两个新的子节点:</span></span><span style="font-family: 宋体">元素(书名),</span><span class="50"><span style="font-size: 9.5pt"><author/></span></span><span style="font-family: 宋体">元素(作者)。我们再一次使用</span><span class="50"><span style="font-size: 9.5pt">text</span></span><span style="font-family: 宋体">属性</span><span style="font-family: palatino-roman">:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">alert(oFirstChild.text);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">代码中没有其他新的内容,我们可以看看图</span><span style="font-family: palatino-roman">4-1</span><span style="font-family: 宋体">中所显示的结果。</span></font></font> </div> <div style="margin-top: 7.5pt"> <span><font face="Verdana" size="1"></font></span> </div> <div style="margin: 7.5pt 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">图</span><span>  4-1</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">请注意,这时我们将获得</span><span class="50"><span style="font-size: 9.5pt"><title/></span></span><span style="font-family: 宋体">和</span><span class="50"><span style="font-size: 9.5pt"><author/></span></span><span style="font-family: 宋体">元素的文本节点,并将其连接在一起。这就是</span><span class="50"><span style="font-size: 9.5pt">text</span></span><span style="font-family: 宋体">与</span><span class="50"><span style="font-size: 9.5pt">nodeValue</span></span><span style="font-family: 宋体">的不同之处。</span><span class="50"><span style="font-size: 9.5pt">nodeValue</span></span><span style="font-family: 宋体">属性只能得到当前节点的值,而</span><span class="50"><span style="font-size: 9.5pt">text</span></span><span style="font-family: 宋体">属性则将得到包含当前节点及其子节点的所有文本节点。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: palatino-roman">MSXML</span><span style="font-family: 宋体">还提供其他一些获取特定节点或数值的方法,最常用的方法是</span><span class="50"><span style="font-size: 9.5pt">getAttribute()</span></span><span style="font-family: 宋体">和</span><span class="50"><span style="font-size: 9.5pt">getElementsByTagName()</span></span><span style="font-family: 宋体">。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 18.2pt"> <font face="Verdana"><font size="1"><span class="50"><span style="font-size: 9.5pt">getAttribute()</span></span><span style="font-family: 宋体">方法将接受一个包含属性名称的字符串型参数,并返回属性值。如果指定的属性不存在,那么返回的值为</span><span class="50"><span style="font-size: 9.5pt">null</span></span><span style="font-family: 宋体">。我们还将使用本小节前面提到的那个</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">文档,请看下列代码:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var sAttribute = oFirstChild.getAttribute("isbn");</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">alert(sAttribute);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">这段代码获取第一个</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素的</span><span class="50"><span style="font-size: 9.5pt">isbn</span></span><span style="font-family: 宋体">属性值,并将其赋值给变量</span><span class="50"><span style="font-size: 9.5pt">sAttribute</span></span><span class="50"><span style="font-size: 9.5pt; font-family: 宋体">,</span></span><span style="font-family: 宋体">然后使用</span><span class="50"><span style="font-size: 9.5pt">Alert()</span></span><span style="font-family: 宋体">方法显示该值。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 18.2pt"> <font face="Verdana"><font size="1"><span class="50"><span style="font-size: 9.5pt">getElementsByTagName()</span></span><span style="font-family: 宋体">方法根据其参数所指定的名字,返回子元素的</span><span class="50"><span style="font-size: 9.5pt">NodeList</span></span><span style="font-family: 宋体">。该方法只搜索给定的节点中的元素,所以返回的</span><span class="50"><span style="font-size: 9.5pt">NodeList</span></span><span style="font-family: 宋体">不包含任何外部元素。例如:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var cBooks = oRoot.getElementsByTagName("book");</font></span> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">alert(cBooks.length);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">这段代码获取文档中所有的</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素,并将返回的</span><span class="50"><span style="font-size: 9.5pt">NodeList</span></span><span style="font-family: 宋体">赋值给变量</span><span class="50"><span style="font-size: 9.5pt">cBooks</span></span><span style="font-family: 宋体">。对于前面那个</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">文档例子而言,警告框将显示找到的四个</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素。如果要获取所有子节点,那么必须用“</span><span class="50"><span style="font-size: 9.5pt">*</span></span><span style="font-family: 宋体">”作为</span><span class="50"><span style="font-size: 9.5pt">getElementsByTagName()</span></span><span style="font-family: 宋体">方法的参数,其代码如下所示:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var cElements = oRoot.getElementsByTagName("*");</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">因为前面的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">文档例子中只包含</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素,所以这段代码的结果与上一个示例相同。</span></font></font> </div> <div class="4" style="margin-top: 7.5pt; text-indent: 21pt"> <font face="Verdana"><font size="1"><span>3. </span><span style="font-family: 黑体">在</span><span>IE</span><span style="font-family: 黑体">中获取</span><span>XML</span><span style="font-family: 黑体">数据</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">要获取</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据只需使用一个属性,即</span><span class="50"><span style="font-size: 9.5pt">xml</span></span><span style="font-family: 宋体">。该属性将对当前节点的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据进行序列化。</span><span class="5K"><span style="font-family: 楷体_gb2312">序列化(</span>serialization</span><span class="5K"><span style="font-family: 楷体_gb2312">)</span></span><span style="font-family: 宋体">是将对象转换成简单的可存储或可传输格式的过程。</span><span class="50"><span style="font-size: 9.5pt">xml</span></span><span style="font-family: 宋体">属性将</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">转换成字符串形式,包括完整的标签名称、属性和文本:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var sXml = oRoot.xml;</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">alert(sXml);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">这段代码从文档元素开始序列化</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据,并将其作为参数传递给</span><span class="50"><span style="font-size: 9.5pt">alert()</span></span><span style="font-family: 宋体">方法。下面就是部分已序列化的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1"><books><book isbn="0471777781">Professional Ajax</book></books></font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">已序列化的数据可以载入到另一个</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">对象,发送到服务器,或者传给另一个页面。通过</span><span class="50"><span style="font-size: 9.5pt">xml</span></span><span style="font-family: 宋体">属性返回的已序列化</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据,取决于当前节点。如果是在</span><span class="50"><span style="font-size: 9.5pt">documentElement</span></span><span style="font-family: 宋体">节点使用</span><span class="50"><span style="font-size: 9.5pt">xml</span></span><span class="50"><span style="font-size: 9.5pt; font-family: 宋体">属性</span></span><span style="font-family: 宋体">,那么将返回整个文档的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据;如果只是在</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素上使用它,那么将返回该</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素所包含的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 18.2pt"> <font face="Verdana"><font size="1"><span class="50"><span style="font-size: 9.5pt">xml</span></span><span style="font-family: 宋体">属性是只读属性。如果希望往文档中添加元素,那么必须使用</span><span style="font-family: palatino-roman">DOM</span><span style="font-family: 宋体">方法来实现。</span></font></font> </div> <div class="4" style="margin-top: 7.5pt; text-indent: 21pt"> <font face="Verdana"><font size="1"><span>4. </span><span style="font-family: 黑体">在</span><span>IE</span><span style="font-family: 黑体">中操作</span><span>DOM</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">现在为止,我们已经学习如何遍历</span><span style="font-family: palatino-roman">DOM</span><span style="font-family: 宋体">,从</span><span style="font-family: palatino-roman">DOM</span><span style="font-family: 宋体">中提取信息,将</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">转换成字符串格式。接下来学习的是如何在</span><span style="font-family: palatino-roman">DOM</span><span style="font-family: 宋体">中添加、删除和替换节点。</span></font></font> </div> <div class="51" style="margin-top: 7.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">l<span style="font: 7pt ">   </span></span><span style="font-family: 楷体_gb2312">创建节点</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 19.6pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体; letter-spacing: -0.1pt">使用</span><span style="font-family: palatino-roman; letter-spacing: -0.1pt">DOM</span><span style="font-family: 宋体; letter-spacing: -0.1pt">方法可以创建多种不同的节点。第一种就是用</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: -0.1pt">createElement()</span></span><span style="font-family: 宋体; letter-spacing: -0.1pt">方法创建的元素。向该方法传入一个参数,指明要创建的元素标签名称,并返回一个对</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: -0.1pt">XMLDOMElement</span></span><span style="font-family: 宋体; letter-spacing: -0.1pt">的引用:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0cm 0pt; vertical-align: baseline; text-indent: 21.25pt"> <span><font face="Verdana" size="1">var oNewBook = oXmlDom.createElement("book");</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">oXmlDom.documentElement.appendChild(oNewBook);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">这段代码创建一个新的</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素,并通过</span><span class="50"><span style="font-size: 9.5pt">appendChild()</span></span><span style="font-family: 宋体">方法把它添加到</span><span class="50"><span style="font-size: 9.5pt">documentElement</span></span><span style="font-family: 宋体">中。</span><span class="50"><span style="font-size: 9.5pt">appendChild()</span></span><span style="font-family: 宋体">方法添加由其参数指定的新元素,并且将其作为最后一个子节点。但在该例子中,添加到该文档中的是一个空的</span><span style="font-family: palatino-roman"><book/></span><span style="font-family: 宋体">元素,因而还需要为该元素添加一些文本:</span></font></font> </div> <div class="a1" style="margin-top: 7.5pt"> <span><font face="Verdana" size="1">var oNewBook = oXmlDom.createElement("book");</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1">var oNewBookText = oXmlDom.createTextNode("Professional .NET 2.0 Generics");</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1">oNewBook.appendChild(oNewBookText);</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1">oXmlDom.documentElement.appendChild(oNewBook);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">这段代码通过</span><span class="50"><span style="font-size: 9.5pt">createTextNode()</span></span><span style="font-family: 宋体">方法创建一个文本节点,并通过</span><span class="50"><span style="font-size: 9.5pt">appendChild()</span></span><span style="font-family: 宋体">方法把它添加到新创建的</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素中。</span><span class="50"><span style="font-size: 9.5pt">createTextNode()</span></span><span style="font-family: 宋体">方法只有一个字符串参数,用来指定文本节点的值。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">现在已经通过程序创建了新的</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素,为其提供了一个文本节点,并将它添加到文档中。对于这个新元素而言,还需要像其他邻居节点一样,为其设置</span><span class="50"><span style="font-size: 9.5pt">isbn</span></span><span style="font-family: 宋体">属性。这很简单,只要通过</span><span class="50"><span style="font-size: 9.5pt">setAttribute()</span></span><span style="font-family: 宋体">方法就可以创建属性,该方法适用于所有元素节点。</span></font></font> </div> <div class="a1" style="margin-top: 7.5pt"> <span><font face="Verdana" size="1">var oNewBook = oXmlDom.createElement("book");</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1">var oNewBookText = oXmlDom.createTextNode("Professional .NET 2.0 Generics");</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">oNewBook.appendChild(oNewBookText);</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">oNewBook.setAttribute("isbn","0764559885");</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1">oXmlDom.documentElement.appendChild(oNewBook);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">上面这段代码中,新添加的一行是用来创建</span><span class="50"><span style="font-size: 9.5pt">isbn</span></span><span style="font-family: 宋体">属性的,并将其值赋为</span><span class="50"><span style="font-size: 9.5pt">0764559885</span></span><span style="font-family: 宋体">。</span><span class="50"><span style="font-size: 9.5pt">setAttribute()</span></span><span style="font-family: 宋体">方法有两个参数:第一个参数是属性名,第二个参数则是赋给该属性的值。对于向元素添加属性,</span><span style="font-family: palatino-roman">IE</span><span style="font-family: 宋体">还提供其他一些方法,不过它们实际上并不比</span><span class="50"><span style="font-size: 9.5pt">setAttribute()</span></span><span style="font-family: 宋体">更好用,而且还需要更多的编码。</span></font></font> </div> <div class="51" style="margin-top: 7.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">l<span style="font: 7pt ">   </span></span><span style="font-family: 楷体_gb2312">删除、替换和插入节点</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">如果能够往文档中添加节点,那么同样意味着可以删除节点。</span><span class="50"><span style="font-size: 9.5pt">removeChild()</span></span><span style="font-family: 宋体">方法正是用来实现该功能的。该方法包含一个参数:要删除的节点。例如,要从文档中删除第一个</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素,则可以使用以下代码:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var oRemovedChild = oRoot.removeChild(oRoot.firstChild);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span class="50"><span style="font-size: 9.5pt">removeChild()</span></span><span style="font-family: 宋体">方法返回被删除的子节点,因而</span><span class="50"><span style="font-size: 9.5pt">oRemoveChild</span></span><span style="font-family: 宋体">变量将指向已删除的</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素。当拥有对旧节点的引用时,就可以将其放置在文档的任何地方。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">如果想用</span><span class="50"><span style="font-size: 9.5pt">oRemovedChild</span></span><span style="font-family: 宋体">指向的元素来替换第三个</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素,那么可以通过</span><span class="50"><span style="font-size: 9.5pt">replaceChild()</span></span><span style="font-family: 宋体">方法来实现,该方法返回被替换的节点:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var oReplacedChild = oRoot.replaceChild(oRemovedChild, oRoot.childNodes[2]);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span class="50"><span style="font-size: 9.5pt">replaceChild()</span></span><span style="font-family: 宋体">方法接受两个参数:新添加的节点和将被替换的节点。在这段代码中,将用</span><span class="50"><span style="font-size: 9.5pt">oRemovedChild</span></span><span style="font-family: 宋体">变量引用的节点替换第三个</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素,而被替换节点的引用将存在</span><span class="50"><span style="font-size: 9.5pt">oReplacedChild</span></span><span style="font-family: 宋体">变量中。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">由于</span><span class="50"><span style="font-size: 9.5pt">oReplaceChild</span></span><span style="font-family: 宋体">变量是被替换节点的引用,因而可以容易地将其插入到文档中。使用</span><span class="50"><span style="font-size: 9.5pt">appendChild()</span></span><span style="font-family: 宋体">方法可以该其添加到子节点列表的最后,也可以使用</span><span class="50"><span style="font-size: 9.5pt">insertBefore()</span></span><span style="font-family: 宋体">方法将该节点插入到某个节点之前:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">oRoot.insertBefore(oReplacedChild, oRoot.lastChild);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">这段代码将之前被替换的节点插入到最后一个</span><span class="50"><span style="font-size: 9.5pt"><book/></span></span><span style="font-family: 宋体">元素的前面。</span><span class="50"><span style="font-size: 9.5pt">lastChild</span></span><span style="font-family: 宋体">属性的用法与</span><span class="50"><span style="font-size: 9.5pt">firstChild</span></span><span class="50"><span style="font-size: 9.5pt; font-family: 宋体">选择第一个子节点</span></span><span style="font-family: 宋体">非常相似,通过该属性可以获取最后一个子节点。</span><span class="50"><span style="font-size: 9.5pt">insertBefore()</span></span><span style="font-family: 宋体">方法接受两个参数:要插入的节点和表示插入点的节点(插入点在该节点之前)。该方法也将返回插入节点的值,但上述例子中并不需要。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">如你所见,</span><span style="font-family: palatino-roman">DOM</span><span style="font-family: 宋体">是一个相当强大的接口,通过它可以实现数据的获取、删除和添加等操作。</span></font></font> </div> <div class="4" style="margin-top: 7.5pt; text-indent: 21pt"> <font face="Verdana"><font size="1"><span>5. </span><span style="font-family: 黑体">在</span><span>IE</span><span style="font-family: 黑体">中处理错误</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">在</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据的载入过程中,可能会由于不同的原因而抛出错误。例如,外部的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">文件找不到,或者</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">的格式不正确。为了处理这些情况,</span><span style="font-family: palatino-roman">MSXML</span><span style="font-family: 宋体">提供了一个包含错误信息的</span><span class="50"><span style="font-size: 9.5pt">parseError</span></span><span style="font-family: 宋体">对象。对于每个由</span><span style="font-family: palatino-roman">MSXML</span><span style="font-family: 宋体">创建的</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">文档对象而言,该对象都是其所属的属性值之一。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">我们可以通过</span><span class="50"><span style="font-size: 9.5pt">parseError</span></span><span style="font-family: 宋体">对象公开的与整数</span><span style="font-family: palatino-roman">0</span><span style="font-family: 宋体">进行比较的</span><span class="50"><span style="font-size: 9.5pt">errorCode</span></span><span style="font-family: 宋体">属性来检查错误。如果</span><span class="50"><span style="font-size: 9.5pt">errorCode</span></span><span style="font-family: 宋体">不等于</span><span style="font-family: palatino-roman">0</span><span style="font-family: 宋体">,则表示有错误发生。下面的例子故意设计出现一个错误。</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var sXml = "<root><person><name>Jeremy McPeak</name></root>";</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">var oXmlDom = createDocument();</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">oXmlDom.loadXML(sXml);</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1">if (oXmlDom.parseError.errorCode != 0) {</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">    alert("An Error Occurred: " + oXmlDom.parseError.reason);</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">} else {</font></span> </div> <div class="a1"> <font face="Verdana"><font size="1"><span>    //</span><span style="font-family: 楷体_gb2312">当</span><span>XML</span><span style="font-family: 楷体_gb2312">载入成功后的操作</span></font></font> </div> <div class="a1"> <span><font face="Verdana" size="1">}</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">大家会注意到,在突出显示的代码行中,</span><span class="50"><span style="font-size: 9.5pt"><person></span></span><span style="font-family: 宋体">元素是不完整的(没有相应的</span><span class="50"><span style="font-size: 9.5pt"></person></span></span><span style="font-family: 宋体">标签)。由于要载入的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">的格式不正确,因此将产生一个错误。然后</span><span class="50"><span style="font-size: 9.5pt">errorCode</span></span><span style="font-family: 宋体">与</span><span style="font-family: palatino-roman">0</span><span style="font-family: 宋体">进行比较,如果不相等(在本例中就不相等),那么将显示发生错误的警告。要实现该功能,可以使用</span><span class="50"><span style="font-size: 9.5pt">parseError</span></span><span style="font-family: 宋体">对象的</span><span class="50"><span style="font-size: 9.5pt">reason</span></span><span style="font-family: 宋体">属性来获取错误出现的原因。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 18.2pt"> <font face="Verdana"><font size="1"><span class="50"><span style="font-size: 9.5pt">parseError</span></span><span style="font-family: 宋体">对象提供了以下属性,能够帮助你更好地了解错误:</span></font></font> </div> <div class="a2" style="margin-top: 4.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">q<span style="font: 7pt ">  </span></span><span class="50"><span style="font-size: 9.5pt">errorCode:</span></span><span style="font-family: 宋体">错误代码(长整型);</span></font></font> </div> <div class="a2" style="margin-top: 4.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">q<span style="font: 7pt ">  </span></span><span class="50"><span style="font-size: 9.5pt">filePos:</span></span><span style="font-family: 宋体">在文件中发生错误的位置(长整型);</span></font></font> </div> <div class="a2" style="margin-top: 4.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">q<span style="font: 7pt ">  </span></span><span class="50"><span style="font-size: 9.5pt">line:</span></span><span style="font-family: 宋体">包含错误的代码行的行号(长整型);</span></font></font> </div> <div class="a2" style="margin-top: 4.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">q<span style="font: 7pt ">  </span></span><span class="50"><span style="font-size: 9.5pt">linePos</span></span><span>:</span><span style="font-family: 宋体">在特定行中发生错误的位置(长整型);</span></font></font> </div> <div class="a2" style="margin-top: 4.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">q<span style="font: 7pt ">  </span></span><span class="50"><span style="font-size: 9.5pt">reason: </span></span><span style="font-family: 宋体">错误的原因(字符串型);</span></font></font> </div> <div class="a2" style="margin-top: 4.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">q<span style="font: 7pt ">  </span></span><span class="50"><span style="font-size: 9.5pt">srcText: </span></span><span style="font-family: 宋体">发生错误的代码行内容(字符串型);</span></font></font> </div> <div class="a2" style="margin-top: 4.5pt"> <font face="Verdana"><font size="1"><span style="font-size: 9pt; font-family: wingdings">q<span style="font: 7pt ">  </span></span><span class="50"><span style="font-size: 9.5pt">url:</span></span><span> XML</span><span style="font-family: 宋体">文档的</span><span>URL</span><span style="font-family: 宋体">(字符串型)。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <span style="font-family: 宋体"><font face="Verdana" size="1">尽管这些属性提供了每种错误的信息,但是应该使用哪个属性,则取决于你的需要。</font></span> </div> <div style="border-right: windowtext 1pt solid; padding-right: 4pt; border-top: windowtext 1pt solid; padding-left: 4pt; background: #dfdfdf; padding-bottom: 4pt; margin-left: 5.5pt; border-left: windowtext 1pt solid; margin-right: 5.5pt; padding-top: 2pt; border-bottom: windowtext 1pt solid"> <div class="af0" style="background: #dfdfdf; margin: 7.5pt 0cm; text-indent: 19.3pt"> <font face="Verdana"><font size="1"><b><span style="font-family: courier; letter-spacing: -0.2pt">errorCode</span></b><span style="font-family: 黑体; letter-spacing: -0.2pt">属性可以是正数也可以是负数,只有当</span><b><span style="font-family: courier; letter-spacing: -0.2pt">errorCode</span></b><span style="font-family: 黑体; letter-spacing: -0.2pt">为</span><span style="letter-spacing: -0.2pt">0</span><span style="font-family: 黑体; letter-spacing: -0.2pt">时才表示没有错误发生。</span></font></font> </div> </div> <h4><font face="Verdana" size="1"></font> </h4> <h4><font face="Verdana" size="1">Firefox中的XML DOM</font></h4> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">现在我们来看看</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中的</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">实现,</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">的开发人员采用更为标准的方法,将其作为</span><span style="font-family: palatino-roman">JavaScript</span><span style="font-family: 宋体">实现的一部分。</span><span style="font-family: palatino-roman">Mozilla</span><span style="font-family: 宋体">确保所有基于</span><span style="font-family: palatino-roman">Gecko</span><span style="font-family: 宋体">的浏览器的所有平台都支持</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中创建一个</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">,需要调用</span><span class="50"><span style="font-size: 9.5pt">document.implementation</span></span><span style="font-family: 宋体">对象的</span><span class="50"><span style="font-size: 9.5pt">createDocument()</span></span><span style="font-family: 宋体">方法。该方法接受三个参数:第一个参数是包含文档所使用的命名空间</span><span style="font-family: palatino-roman">URI</span><span style="font-family: 宋体">的字符串;第二个参数是包含文档根元素名称的字符串;第三个参数是要创建的文档类型(也称为</span><span style="font-family: palatino-roman">doctype</span><span style="font-family: 宋体">)。如果要创建空的</span><span style="font-family: palatino-roman">DOM</span><span style="font-family: 宋体">文档,则代码如下所示:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var oXmlDom = document.implementation.createDocument("", "", null);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">前两个参数是空字符串,第三个参数为</span><span class="50"><span style="font-size: 9.5pt">null</span></span><span style="font-family: 宋体">,这样可以确保生成一个彻底的空文档。事实上,现在</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中并不提供针对文档类型的</span><span style="font-family: palatino-roman">JavaScript</span><span style="font-family: 宋体">支持,所以第三个参数总是为</span><span class="50"><span style="font-size: 9.5pt">null</span></span><span style="font-family: 宋体">。如果要创建包含文档元素的</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">,那么可以在第二个参数中指定标签名称:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var oXmlDom = document.implementation.createDocument("", "books", null);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">这段代码创建了一个</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">,其</span><span class="50"><span style="font-size: 9.5pt">documentElement</span></span><span style="font-family: 宋体">是</span><span class="50"><span style="font-size: 9.5pt"><books/></span></span><span style="font-family: 宋体">。如果要创建包含指定命名空间的</span><span style="font-family: palatino-roman">DOM</span><span style="font-family: 宋体">,可以在第一个参数中指定命名空间</span><span style="font-family: palatino-roman">URI</span><span style="font-family: 宋体">:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var oXmlDom = document.implementation.createDocument("http://www.site1.com",</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">       "books", null);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">当在</span><span class="50"><span style="font-size: 9.5pt">createDocument()</span></span><span style="font-family: 宋体">方法中指定命名空间时,</span><span style="font-family: palatino-roman"> Firefox</span><span style="font-family: 宋体">会自动附上前缀</span><span class="50"><span style="font-size: 9.5pt">a0</span></span><span class="50"><span style="font-size: 9.5pt; font-family: 宋体">以表示</span></span><span style="font-family: 宋体">命名空间</span><span style="font-family: palatino-roman">URI</span><span style="font-family: 宋体">:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1"><a0:books xmlns:a0="http://www.site1.com" /></font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">接着,你可以通过程序来填充</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">文档,不过在一般情况下,还需要在空的</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">对象中载入现有的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">文档。</span></font></font> </div> <div class="4" style="margin-top: 7.5pt; text-indent: 21pt"> <font face="Verdana"><font size="1"><span>1. </span><span style="font-family: 黑体">在</span><span>Firefox</span><span style="font-family: 黑体">中载入</span><span>XML</span><span style="font-family: 黑体">数据</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">在</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中,将</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">载入</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">的方法和微软采用的方法大致相同,只存在一个显著区别:</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">只支持</span><span class="50"><span style="font-size: 9.5pt">load()</span></span><span style="font-family: 宋体">方法。因此,在这两种浏览器中载入外部</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据的代码是相同的:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">oXmlDom.load("books.xml");</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">与微软的</span><span style="font-family: palatino-roman">IE</span><span style="font-family: 宋体">一样,</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">同样实现了</span><span class="50"><span style="font-size: 9.5pt">async</span></span><span style="font-family: 宋体">属性,该属性的行为也与其一致:将</span><span class="50"><span style="font-size: 9.5pt">async</span></span><span style="font-family: 宋体">设置为</span><span class="50"><span style="font-size: 9.5pt">false</span></span><span style="font-family: 宋体">,表示以同步模式载入文档;否则,以异步模式载入文档。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">的</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">实现和微软的</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">实现还存在另一个不同,即</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">不支持</span><span class="50"><span style="font-size: 9.5pt">readyState</span></span><span style="font-family: 宋体">属性及</span><span class="50"><span style="font-size: 9.5pt">onreadystatechange</span></span><span style="font-family: 宋体">事件处理函数。在</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中,支持</span><span class="50"><span style="font-size: 9.5pt">load</span></span><span style="font-family: 宋体">事件和</span><span class="50"><span style="font-size: 9.5pt">onload</span></span><span style="font-family: 宋体">事件处理函数。在文档完全载入后将触发</span><span class="50"><span style="font-size: 9.5pt">load</span></span><span style="font-family: 宋体">事件:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">oXmlDom.load("books.xml");</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">oXmlDom.onload = function () {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <font face="Verdana"><font size="1"><span>    //</span><span style="font-family: 楷体_gb2312">文档完全载入后的操作</span></font></font> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">};</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">正如前面所说,在</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">的</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">实现中,并没有</span><span class="50"><span style="font-size: 9.5pt">loadXML()</span></span><span style="font-family: 宋体">方法,不过通过</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中的</span><span class="50"><span style="font-size: 9.5pt">DOMParser</span></span><span style="font-family: 宋体">类可以模拟</span><span class="50"><span style="font-size: 9.5pt">loadXML()</span></span><span style="font-family: 宋体">的行为。该类有一个名为</span><span class="50"><span style="font-size: 9.5pt">parseFromString()</span></span><span style="font-family: 宋体">的方法,用来载入字符串并解析成文档:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var sXml = "<root><person><name>Jeremy McPeak</name></person></root>";</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">var oParser = new DOMParser();</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">var oXmlDom = oParser.parseFromString(sXml,"text/xml");</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">在这段代码中,创建了一个</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">字符串,并作为参数传递给</span><span class="50"><span style="font-size: 9.5pt">DOMParser</span></span><span style="font-family: 宋体">的</span><span class="50"><span style="font-size: 9.5pt">parseFromString()</span></span><span style="font-family: 宋体">方法。</span><span class="50"><span style="font-size: 9.5pt">parseFromString()</span></span><span style="font-family: 宋体">方法的两个参数分别是</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">字符串和数据的内容类型(一般设置为</span><span class="50"><span style="font-size: 9.5pt">text/xml</span></span><span style="font-family: palatino-roman">)</span><span style="font-family: 宋体">。</span><span class="50"><span style="font-size: 9.5pt">parseFromString()</span></span><span style="font-family: 宋体">方法返回</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">对象,因此这里得到的</span><span class="50"><span style="font-size: 9.5pt">oXmlDom</span></span><span style="font-family: 宋体">与第一个例子相同。</span></font></font> </div> <div class="4" style="margin-top: 7.5pt; text-indent: 21pt"> <font face="Verdana"><font size="1"><span>2. </span><span style="font-family: 黑体">在</span><span>Firefox</span><span style="font-family: 黑体">中获取</span><span>XML</span><span style="font-family: 黑体">数据</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">尽管存在这样那样的不同,但</span><span style="font-family: palatino-roman">IE</span><span style="font-family: 宋体">和</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中用于获取文档中</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据的大多数属性和方法是一致的。正如在</span><span style="font-family: palatino-roman">IE</span><span style="font-family: 宋体">中,可以使用</span><span class="50"><span style="font-size: 9.5pt">documentElement</span></span><span style="font-family: 宋体">属性来获取文档的根元素,例如:</span></font></font> </div> <div class="a1" style="margin-top: 7.5pt"> <span><font face="Verdana" size="1">var oRoot = oXmlDom.documentElement;</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: palatino-roman; letter-spacing: 0.2pt">Firefox</span><span style="font-family: 宋体; letter-spacing: 0.2pt">同样支持</span><span style="font-family: palatino-roman; letter-spacing: 0.2pt">W3C</span><span style="font-family: 宋体; letter-spacing: 0.2pt">标准属性,包括</span><span class="50"><span style="font-size: 9.5pt">childNodes</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">firstChild</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">lastChild</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">nextSibling</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">nodeName</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">nodeType</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">nodeValue</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">ownerDocument</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">、</span><span class="50"><span style="font-size: 9.5pt">parentNode</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">和</span><span class="50"><span style="font-size: 9.5pt">previousSibling</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">。不幸的是,对于微软专有的</span><span class="50"><span style="font-size: 9.5pt">text</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">和</span><span class="50"><span style="font-size: 9.5pt">xml</span></span><span style="font-family: 宋体; letter-spacing: 0.2pt">属性,</span><span style="font-family: palatino-roman; letter-spacing: 0.2pt">Firefox</span><span style="font-family: 宋体; letter-spacing: 0.2pt">并不支持,不过可以利用其他方法来模拟该属性的行为。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">大家应该还记得,</span><span class="50"><span style="font-size: 9.5pt">text</span></span><span style="font-family: 宋体">属性返回了当前节点的内容,或者是当前节点及其子节点的内容。这不仅仅返回当前节点的文本,还有所有子节点的文本,因此要模拟该功能实现是十分容易的。下面这个简单的函数就能够完成该功能,该函数唯一的参数是一个节点:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">function getText(oNode) {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    var sText = "";</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    for (var i = 0; i < oNode.childNodes.length; i++) {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">       if (oNode.childNodes[i].hasChildNodes()) {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">           sText += getText(oNode.childNodes[i]);</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">       } else {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">           sText += oNode.childNodes[i].nodeValue;</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">       }</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    }</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    return sText;</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">}</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">在</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">getText()</span></span><span style="font-family: 宋体">函数中,</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">sText</span></span><span style="font-family: 宋体">变量用来保存获取的所有文本。接着对</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">oNode</span></span><span style="font-family: 宋体">的子节点使用</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">for</span></span><span class="50"><span style="font-size: 9.5pt; font-family: 宋体; letter-spacing: 0pt">循环</span></span><span style="font-family: 宋体">进行遍历,检查每个子节点是否包含子节点。如果有子节点,那么就将其</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">childNode</span></span><span style="font-family: 宋体">传给</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">getText()</span></span><span style="font-family: 宋体">函数,并进行同样的处理;如果没有子节点,那么将当前节点的</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">nodeValue</span></span><span style="font-family: 宋体">加到字符串中(对文本节点而言,这只是文本字符串)。处理了所有子节点后,该函数返回变量</span><span class="50"><span style="font-size: 9.5pt; letter-spacing: 0pt">sText</span></span><span style="font-family: 宋体">。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: palatino-roman">IE</span><span style="font-family: 宋体">中的</span><span class="50"><span style="font-size: 9.5pt">xml</span></span><span style="font-family: 宋体">属性将存放对当前节点包含的所有</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">进行序列化的结果。在</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">中,提供了一个名为</span><span class="50"><span style="font-size: 9.5pt">XMLSerializer</span></span><span style="font-family: 宋体">对象来完成这一功能。该对象提供一个使用</span><span style="font-family: palatino-roman">JavaScript</span><span style="font-family: 宋体">可访问的</span><span class="50"><span style="font-size: 9.5pt">serializeToString()</span></span><span style="font-family: 宋体">方法,使用该方法可以对</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据进行序列化。</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">function serializeXml(oNode) {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    var oSerializer = new XMLSerializer();</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    return oSerializer.serializeToString(oNode);</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">}</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span class="50"><span style="font-size: 9.5pt">serializeXml()</span></span><span style="font-family: 宋体">函数以</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">节点作为参数,创建一个</span><span class="50"><span style="font-size: 9.5pt">XMLSerializer</span></span><span style="font-family: 宋体">对象,并将该节点传给</span><span class="50"><span style="font-size: 9.5pt">serializeToString()</span></span><span style="font-family: 宋体">方法。该方法将向调用者返回</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">数据的字符串表示。</span></font></font> </div> <div class="MsoNormal" style="margin: 7.5pt 0cm; text-indent: 20pt"> <font face="Verdana"><font size="1"><span class="5K"><span style="font-family: 楷体_gb2312">对于节点操作的</span>DOM</span><span class="5K"><span style="font-family: 楷体_gb2312">方法,</span>Firefox</span><span class="5K"><span style="font-family: 楷体_gb2312">与</span>IE</span><span class="5K"><span style="font-family: 楷体_gb2312">大致相同。参见“在</span>IE</span><span class="5K"><span style="font-family: 楷体_gb2312">中操作</span>DOM</span><span class="5K"><span style="font-family: 楷体_gb2312">”小节。</span></span></font></font> </div> <div class="4" style="margin-top: 7.5pt; text-indent: 21pt"> <font face="Verdana"><font size="1"><span>3. </span><span style="font-family: 黑体">在</span><span>Firefox</span><span style="font-family: 黑体">中处理错误</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">与</span><span style="font-family: palatino-roman">IE</span><span style="font-family: 宋体">的错误处理并不一样。当</span><span style="font-family: palatino-roman">IE</span><span style="font-family: 宋体">遇到错误时,它会填充</span><span class="50"><span style="font-size: 9.5pt">parseError</span></span><span style="font-family: 宋体">对象;而当</span><span style="font-family: palatino-roman">Firefox</span><span style="font-family: 宋体">遇到错误时,它会将包含错误信息的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">文档载入到</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">文档中。看下面的这个例子:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var sXml = "<root><person><name>Jeremy McPeak</name></root>";</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">var oParser = new DOMParser();</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">var oXmlDom = oParser.parseFromString(sXml,"text/xml");</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="a1"> <span><font face="Verdana" size="1">if (oXmlDom.documentElement.tagName != "parsererror") {</font></span> </div> <div class="a1"> <font face="Verdana"><font size="1"><span>    //</span><span style="font-family: 楷体_gb2312">没有错误发生,进行所需操作</span></font></font> </div> <div class="a1"> <span><font face="Verdana" size="1">} else {</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">    alert("An Error Occurred");</font></span> </div> <div class="a1"> <span><font face="Verdana" size="1">}</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">在突出显示的代码行中,你会发现其中将产生一个错误:</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">字符串格式不正确(因为</span><span class="50"><span style="font-size: 9.5pt"><person></span></span><span style="font-family: 宋体">元素不完整,没有相应的</span><span class="50"><span style="font-size: 9.5pt"></person></span></span><span style="font-family: 宋体">元素)。当载入错误的</span><span style="font-family: palatino-roman">XML</span><span style="font-family: 宋体">时,</span><span style="font-family: palatino-roman">XML DOM</span><span style="font-family: 宋体">对象将会载入一个</span><span class="50"><span style="font-size: 9.5pt">documentElement</span></span><span style="font-family: 宋体">为</span><span class="50"><span style="font-size: 9.5pt"><parsererror/></span></span><span style="font-family: 宋体">的错误文档。我们可以通过检查</span><span class="50"><span style="font-size: 9.5pt">documentElement</span></span><span style="font-family: 宋体">的</span><span class="50"><span style="font-size: 9.5pt">tagName</span></span><span style="font-family: 宋体">属性来很容易地确定是否发生错误。如果</span><span class="50"><span style="font-size: 9.5pt">tagName</span></span><span style="font-family: 宋体">属性不是</span><span class="50"><span style="font-size: 9.5pt">parsererror</span></span><span style="font-family: 宋体">,就可以确定没有发生任何错误。</span></font></font> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 20pt"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">在本例中,可能会生成如下所示的错误文档:</span><span style="font-family: palatino-roman"> </span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1"><parsererror xmlns="http://www.mozilla.org/newlayout/xml/parsererror.xml">XML</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">Parsing Error: mismatched tag. Expected: </person>.</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">Location: [url]http://yoda/fooreader/test.htm[/url]</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">Line Number 1, Column 43:<sourcetext><root><person><name>Jeremy</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">McPeak</name></root></font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">------------------------------------------^</sourcetext></parsererror></font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <span style="font-family: 宋体"><font face="Verdana" size="1">所有的错误信息都包含在错误文档的文本中。如果要通过程序使用这些错误信息,那么首先就要对其进行解析。最简单的方法是使用一个稍长的正则表达式:</font></span> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">该正则表达式将错误文档分为五个部分:错误消息、发生错误的文件名、行号、该行中发生错误的位置,以及发生错误的源代码。使用正则表达式对象的</span><span class="50"><span style="font-size: 9.5pt">test()</span></span><span style="font-family: 宋体">方法可以使用这些信息:</span></font></font> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">if (oXmlDom.firstChild.tagName != "parsererror") {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <font face="Verdana"><font size="1"><span>    //</span><span style="font-family: 楷体_gb2312">没有错误发生,进行所需操作</span></font></font> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">} else {</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    var oXmlSerializer = new XMLSerializer();</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    var sXmlError = oXmlSerializer.serializeToString(oXmlDom);</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    var reError = />([\s\S]*?)Location:([\s\S]*?)Line Number (\d+), Column</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">       (\d+):<sourcetext>([\s\S]*?)(?:\-*\^)/;</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    reError.test(sXmlError);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <span style="font-family: 宋体"><font face="Verdana" size="1">正则表达式捕获到的第一部分数据是错误消息,第二部分是文件名,第三部分是行号,第四部分是行内位置,第五部分是源码。你可以使用这些解析后的信息来创建自定义的错误消息:</font></span> </div> <div class="af4" style="margin: 7.5pt 0.5pt 0pt 1.4pt"> <span><font face="Verdana" size="1">var str = "An error occurred!!\n" +</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    "Description: " + RegExp.$1 + "\n" +</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    "File: " + RegExp.$2 + "\n" +</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    "Line: " + RegExp.$3 + "\n" +</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    "Line Position: " + RegExp.$4 + "\n" +</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">    "Source Code: " + RegExp.$5;</font></span> </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1"></font></span>  </div> <div class="af4" style="margin-right: 0.5pt"> <span><font face="Verdana" size="1">alert(str);</font></span> </div> <div class="MsoNormal" style="margin-top: 4.5pt; text-indent: 0cm"> <font face="Verdana"><font size="1"><span style="font-family: 宋体">如果发生错误,那么</span><span class="50"><span style="font-size: 9.5pt">alert()</span></span><span style="font-family: 宋体">方法会以易于阅读的格式在警告框中来显示相关的错误信息。</span></font></font> </div> </div> </div> </div> </div> </div> <!--PC和WAP自适应版--> <div id="SOHUCS" sid="1281527699071844352"></div> <script type="text/javascript" src="/views/front/js/chanyan.js"></script> <!-- 文章页-底部 动态广告位 --> <div class="youdao-fixed-ad" id="detail_ad_bottom"></div> </div> <div class="col-md-3"> <div class="row" id="ad"> <!-- 文章页-右侧1 动态广告位 --> <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_1"> </div> </div> <!-- 文章页-右侧2 动态广告位 --> <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_2"></div> </div> <!-- 文章页-右侧3 动态广告位 --> <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad"> <div class="youdao-fixed-ad" id="detail_ad_3"></div> </div> </div> </div> </div> </div> </div> <div class="container"> <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(IE,XML,xml/dom)</h4> <div id="paradigm-article-related"> <div class="recommend-post mb30"> <ul class="widget-links"> <li><a href="/article/1835513699826233344.htm" title="android系统selinux中添加新属性property" target="_blank">android系统selinux中添加新属性property</a> <span class="text-muted">辉色投像</span> <div>1.定位/android/system/sepolicy/private/property_contexts声明属性开头:persist.charge声明属性类型:u:object_r:system_prop:s0图12.定位到android/system/sepolicy/public/domain.te删除neverallow{domain-init}default_prop:property</div> </li> <li><a href="/article/1835513551624695808.htm" title="【iOS】MVC设计模式" target="_blank">【iOS】MVC设计模式</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/mvc/1.htm">mvc</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a> <div>MVC前言如何设计一个程序的结构,这是一门专门的学问,叫做"架构模式"(architecturalpattern),属于编程的方法论。MVC模式就是架构模式的一种。它是Apple官方推荐的App开发架构,也是一般开发者最先遇到、最经典的架构。MVC各层controller层Controller/ViewController/VC(控制器)负责协调Model和View,处理大部分逻辑它将数据从Mod</div> </li> <li><a href="/article/1835513551142350848.htm" title="OC语言多界面传值五大方式" target="_blank">OC语言多界面传值五大方式</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/objective-c/1.htm">objective-c</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>前言在完成暑假仿写项目时,遇到了许多需要用到多界面传值的地方,这篇博客来总结一下比较常用的五种多界面传值的方式。属性传值属性传值一般用前一个界面向后一个界面传值,简单地说就是通过访问后一个视图控制器的属性来为它赋值,通过这个属性来做到从前一个界面向后一个界面传值。首先在后一个界面中定义属性@interfaceBViewController:UIViewController@propertyNSSt</div> </li> <li><a href="/article/1835513424734416896.htm" title="UI学习——cell的复用和自定义cell" target="_blank">UI学习——cell的复用和自定义cell</a> <span class="text-muted">Magnetic_h</span> <a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a> <div>目录cell的复用手动(非注册)自动(注册)自定义cellcell的复用在iOS开发中,单元格复用是一种提高表格(UITableView)和集合视图(UICollectionView)滚动性能的技术。当一个UITableViewCell或UICollectionViewCell首次需要显示时,如果没有可复用的单元格,则视图会创建一个新的单元格。一旦这个单元格滚动出屏幕,它就不会被销毁。相反,它被添</div> </li> <li><a href="/article/1835511036317364224.htm" title="Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断" target="_blank">Cell Insight | 单细胞测序技术又一新发现,可用于HIV-1和Mtb共感染个体诊断</a> <span class="text-muted">尐尐呅</span> <div>结核病是艾滋病合并其他疾病中导致患者死亡的主要原因。其中结核病由结核分枝杆菌(Mycobacteriumtuberculosis,Mtb)感染引起,获得性免疫缺陷综合症(艾滋病)由人免疫缺陷病毒(Humanimmunodeficiencyvirustype1,HIV-1)感染引起。国家感染性疾病临床医学研究中心/深圳市第三人民医院张国良团队携手深圳华大生命科学研究院吴靓团队,共同研究得出单细胞测序</div> </li> <li><a href="/article/1835508130268672000.htm" title="消息中间件有哪些常见类型" target="_blank">消息中间件有哪些常见类型</a> <span class="text-muted">xmh-sxh-1314</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>消息中间件根据其设计理念和用途,可以大致分为以下几种常见类型:点对点消息队列(Point-to-PointMessagingQueues):在这种模型中,消息被发送到特定的队列中,消费者从队列中取出并处理消息。队列中的消息只能被一个消费者消费,消费后即被删除。常见的实现包括IBM的MQSeries、RabbitMQ的部分使用场景等。适用于任务分发、负载均衡等场景。发布/订阅消息模型(Pub/Sub</div> </li> <li><a href="/article/1835508131489214464.htm" title="高级编程--XML+socket练习题" target="_blank">高级编程--XML+socket练习题</a> <span class="text-muted">masa010</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>1.北京华北2114.8万人上海华东2,500万人广州华南1292.68万人成都华西1417万人(1)使用dom4j将信息存入xml中(2)读取信息,并打印控制台(3)添加一个city节点与子节点(4)使用socketTCP协议编写服务端与客户端,客户端输入城市ID,服务器响应相应城市信息(5)使用socketTCP协议编写服务端与客户端,客户端要求用户输入city对象,服务端接收并使用dom4j</div> </li> <li><a href="/article/1835504596898902016.htm" title="linux sdl windows.h,Windows下的SDL安装" target="_blank">linux sdl windows.h,Windows下的SDL安装</a> <span class="text-muted">奔跑吧linux内核</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/sdl/1.htm">sdl</a><a class="tag" taget="_blank" href="/search/windows.h/1.htm">windows.h</a> <div>首先你要下载并安装SDL开发包。如果装在C盘下,路径为C:\SDL1.2.5如果在WINDOWS下。你可以按以下步骤:1.打开VC++,点击"Tools",Options2,点击directories选项3.选择"Includefiles"增加一个新的路径。"C:\SDL1.2.5\include"4,现在选择"Libaryfiles“增加"C:\SDL1.2.5\lib"现在你可以开始编写你的第</div> </li> <li><a href="/article/1835504217729626112.htm" title="Python教程:一文了解使用Python处理XPath" target="_blank">Python教程:一文了解使用Python处理XPath</a> <span class="text-muted">旦莫</span> <a class="tag" taget="_blank" href="/search/Python%E8%BF%9B%E9%98%B6/1.htm">Python进阶</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a> <div>目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代</div> </li> <li><a href="/article/1835503965563875328.htm" title="python os.environ_python os.environ 读取和设置环境变量" target="_blank">python os.environ_python os.environ 读取和设置环境变量</a> <span class="text-muted">weixin_39605414</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/os.environ/1.htm">os.environ</a> <div>>>>importos>>>os.environ.keys()['LC_NUMERIC','GOPATH','GOROOT','GOBIN','LESSOPEN','SSH_CLIENT','LOGNAME','USER','HOME','LC_PAPER','PATH','DISPLAY','LANG','TERM','SHELL','J2REDIR','LC_MONETARY','QT_QPA</div> </li> <li><a href="/article/1835497411179540480.htm" title="深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具" target="_blank">深入理解 MultiQueryRetriever:提升向量数据库检索效果的强大工具</a> <span class="text-muted">nseejrukjhad</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a> <div>深入理解MultiQueryRetriever:提升向量数据库检索效果的强大工具引言在人工智能和自然语言处理领域,高效准确的信息检索一直是一个关键挑战。传统的基于距离的向量数据库检索方法虽然广泛应用,但仍存在一些局限性。本文将介绍一种创新的解决方案:MultiQueryRetriever,它通过自动生成多个查询视角来增强检索效果,提高结果的相关性和多样性。MultiQueryRetriever的工</div> </li> <li><a href="/article/1835494762388484096.htm" title="【目标检测数据集】卡车数据集1073张VOC+YOLO格式" target="_blank">【目标检测数据集】卡车数据集1073张VOC+YOLO格式</a> <span class="text-muted">熬夜写代码的平头哥∰</span> <a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1073标注数量(xml文件个数):1073标注数量(txt文件个数):1073标注类别数:1标注类别名称:["truck"]每个类别标注的框数:truck框数=1120总框数:1120使用标注工具:labelImg标注</div> </li> <li><a href="/article/1835492742713667584.htm" title="钢筋长度超限检测检数据集VOC+YOLO格式215张1类别" target="_blank">钢筋长度超限检测检数据集VOC+YOLO格式215张1类别</a> <span class="text-muted">futureflsl</span> <a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E9%9B%86/1.htm">数据集</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a> <div>数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):215标注数量(xml文件个数):215标注数量(txt文件个数):215标注类别数:1标注类别名称:["iron"]每个类别标注的框数:iron框数=215总框数:215使用标注工具:labelImg标注规则:对类别进</div> </li> <li><a href="/article/1835480639814594560.htm" title="在Ubuntu中编译含有JSON的文件出现报错" target="_blank">在Ubuntu中编译含有JSON的文件出现报错</a> <span class="text-muted">芝麻糊76</span> <a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/kill_bug/1.htm">kill_bug</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a> <div>在ubuntu中进行JSON相关学习的时候,我发现了一些小问题,决定与大家进行分享,减少踩坑时候出现不必要的时间耗费截取部分含有JSON部分的代码进行展示char*str="{\"title\":\"JSONExample\",\"author\":{\"name\":\"JohnDoe\",\"age\":35,\"isVerified\":true},\"tags\":[\"json\",\"</div> </li> <li><a href="/article/1835479758033481728.htm" title="SpringBlade dict-biz/list 接口 SQL 注入漏洞" target="_blank">SpringBlade dict-biz/list 接口 SQL 注入漏洞</a> <span class="text-muted">文章永久免费只为良心</span> <a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>SpringBladedict-biz/list接口SQL注入漏洞POC:构造请求包查看返回包你的网址/api/blade-system/dict-biz/list?updatexml(1,concat(0x7e,md5(1),0x7e),1)=1漏洞概述在SpringBlade框架中,如果dict-biz/list接口的后台处理逻辑没有正确地对用户输入进行过滤或参数化查询(PreparedSta</div> </li> <li><a href="/article/1835463874560749568.htm" title="用Python实现简单的猜数字游戏" target="_blank">用Python实现简单的猜数字游戏</a> <span class="text-muted">程序媛了了</span> <a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%B8%B8%E6%88%8F/1.htm">游戏</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>猜数字游戏代码:importrandomdefpythonit():a=random.randint(1,100)n=int(input("输入你猜想的数字:"))whilen!=a:ifn>a:print("很遗憾,猜大了")n=int(input("请再次输入你猜想的数字:"))elifna::如果玩家猜的数字n大于随机数字a,则输出"很遗憾,猜大了",并提示玩家再次输入。elifn<a::如</div> </li> <li><a href="/article/1835460217190576128.htm" title="(179)时序收敛--->(29)时序收敛二九" target="_blank">(179)时序收敛--->(29)时序收敛二九</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%94%B6%E6%95%9B/1.htm">时序收敛</a> <div>1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛二九(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)</div> </li> <li><a href="/article/1835460216590790656.htm" title="(180)时序收敛--->(30)时序收敛三十" target="_blank">(180)时序收敛--->(30)时序收敛三十</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%94%B6%E6%95%9B/1.htm">时序收敛</a> <div>1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛三十(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)</div> </li> <li><a href="/article/1835459963326132224.htm" title="(158)时序收敛--->(08)时序收敛八" target="_blank">(158)时序收敛--->(08)时序收敛八</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%94%B6%E6%95%9B/1.htm">时序收敛</a> <div>1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛八(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)F</div> </li> <li><a href="/article/1835459963850420224.htm" title="(159)时序收敛--->(09)时序收敛九" target="_blank">(159)时序收敛--->(09)时序收敛九</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%94%B6%E6%95%9B/1.htm">时序收敛</a> <div>1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛九(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)F</div> </li> <li><a href="/article/1835459964387291136.htm" title="(160)时序收敛--->(10)时序收敛十" target="_blank">(160)时序收敛--->(10)时序收敛十</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%94%B6%E6%95%9B/1.htm">时序收敛</a> <div>1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛十(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)F</div> </li> <li><a href="/article/1835459837115330560.htm" title="(153)时序收敛--->(03)时序收敛三" target="_blank">(153)时序收敛--->(03)时序收敛三</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%94%B6%E6%95%9B/1.htm">时序收敛</a> <div>1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛三(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)F</div> </li> <li><a href="/article/1835459333165510656.htm" title="(121)DAC接口--->(006)基于FPGA实现DAC8811接口" target="_blank">(121)DAC接口--->(006)基于FPGA实现DAC8811接口</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E6%8E%A5%E5%8F%A3%E5%BC%80%E5%8F%91%28%E9%A1%B9%E7%9B%AE%E5%AE%9E%E6%88%98%29/1.htm">FPGA接口开发(项目实战)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/FPGA/1.htm">FPGA</a><a class="tag" taget="_blank" href="/search/IC/1.htm">IC</a> <div>1目录(a)FPGA简介(b)IC简介(c)Verilog简介(d)基于FPGA实现DAC8811接口(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电</div> </li> <li><a href="/article/1835458955267108864.htm" title="FPGA复位专题---(3)上电复位?" target="_blank">FPGA复位专题---(3)上电复位?</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a> <div>(3)上电复位?1目录(a)FPGA简介(b)Verilog简介(c)复位简介(d)上电复位?(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限</div> </li> <li><a href="/article/1835458199755517952.htm" title="spring如何整合druid连接池?" target="_blank">spring如何整合druid连接池?</a> <span class="text-muted">惜.己</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/junit/1.htm">junit</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/idea/1.htm">idea</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a> <div>目录spring整合druid连接池1.新建maven项目2.新建mavenModule3.导入相关依赖4.配置log4j2.xml5.配置druid.xml1)xml中如何引入properties2)下面是配置文件6.准备jdbc.propertiesJDBC配置项解释7.配置druid8.测试spring整合druid连接池1.新建maven项目打开IDE(比如IntelliJIDEA,Ecl</div> </li> <li><a href="/article/1835455426175528960.htm" title="(182)时序收敛--->(32)时序收敛三二" target="_blank">(182)时序收敛--->(32)时序收敛三二</a> <span class="text-muted">FPGA系统设计指南针</span> <a class="tag" taget="_blank" href="/search/FPGA%E7%B3%BB%E7%BB%9F%E8%AE%BE%E8%AE%A1%28%E5%86%85%E8%AE%AD%29/1.htm">FPGA系统设计(内训)</a><a class="tag" taget="_blank" href="/search/fpga%E5%BC%80%E5%8F%91/1.htm">fpga开发</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E5%BA%8F%E6%94%B6%E6%95%9B/1.htm">时序收敛</a> <div>1目录(a)FPGA简介(b)Verilog简介(c)时钟简介(d)时序收敛三二(e)结束1FPGA简介(a)FPGA(FieldProgrammableGateArray)是在PAL(可编程阵列逻辑)、GAL(通用阵列逻辑)等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。(b)</div> </li> <li><a href="/article/1835453535777550336.htm" title="vue3中el-table中点击图片放大时,被表格覆盖" target="_blank">vue3中el-table中点击图片放大时,被表格覆盖</a> <span class="text-muted">叫我小鹏呀</span> <a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a> <div>问题:vue3中el-table中点击图片放大时,被表格覆盖。解决方法:el-image添加preview-teleported</div> </li> <li><a href="/article/1835448619277316096.htm" title="Android应用性能优化" target="_blank">Android应用性能优化</a> <span class="text-muted">轻口味</span> <a class="tag" taget="_blank" href="/search/Android/1.htm">Android</a> <div>Android手机由于其本身的后台机制和硬件特点,性能上一直被诟病,所以软件开发者对软件本身的性能优化就显得尤为重要;本文将对Android开发过程中性能优化的各个方面做一个回顾与总结。Cache优化ListView缓存:ListView中有一个回收器,Item滑出界面的时候View会回收到这里,需要显示新的Item的时候,就尽量重用回收器里面的View;每次在getView函数中inflate新</div> </li> <li><a href="/article/1835448111909138432.htm" title="react-intl——react国际化使用方案" target="_blank">react-intl——react国际化使用方案</a> <span class="text-muted">苹果酱0567</span> <a class="tag" taget="_blank" href="/search/%E9%9D%A2%E8%AF%95%E9%A2%98%E6%B1%87%E6%80%BB%E4%B8%8E%E8%A7%A3%E6%9E%90/1.htm">面试题汇总与解析</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a> <div>国际化介绍i18n:internationalization国家化简称,首字母+首尾字母间隔的字母个数+尾字母,类似的还有k8s(Kubernetes)React-intl是React中最受欢迎的库。使用步骤安装#usenpmnpminstallreact-intl-D#useyarn项目入口文件配置//index.tsximportReactfrom"react";importReactDOMf</div> </li> <li><a href="/article/1835446943296352256.htm" title="TextFiled 中输入金额" target="_blank">TextFiled 中输入金额</a> <span class="text-muted">宁梓茞</span> <div>要求:输入的金额不能超过六位,小数点后面只能输入两位小数如果textFIled中第一位输入的是0,后面必须输入小数点,否则禁止输入用到textfiled代理方法#pragmamark----textFiledDelegate-----(BOOL)textField:(UITextField*)textFieldshouldChangeCharactersInRange:(NSRange)range</div> </li> <li><a href="/article/62.htm" title="关于旗正规则引擎下载页面需要弹窗保存到本地目录的问题" target="_blank">关于旗正规则引擎下载页面需要弹窗保存到本地目录的问题</a> <span class="text-muted">何必如此</span> <a class="tag" taget="_blank" href="/search/jsp/1.htm">jsp</a><a class="tag" taget="_blank" href="/search/%E8%B6%85%E9%93%BE%E6%8E%A5/1.htm">超链接</a><a class="tag" taget="_blank" href="/search/%E6%96%87%E4%BB%B6%E4%B8%8B%E8%BD%BD/1.htm">文件下载</a><a class="tag" taget="_blank" href="/search/%E7%AA%97%E5%8F%A3/1.htm">窗口</a> <div>生成下载页面是需要选择“录入提交页面”,生成之后默认的下载页面<a>标签超链接为:<a href="<%=root_stimage%>stimage/image.jsp?filename=<%=strfile234%>&attachname=<%=java.net.URLEncoder.encode(file234filesourc</div> </li> <li><a href="/article/189.htm" title="【Spark九十八】Standalone Cluster Mode下的资源调度源代码分析" target="_blank">【Spark九十八】Standalone Cluster Mode下的资源调度源代码分析</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/cluster/1.htm">cluster</a> <div>在分析源代码之前,首先对Standalone Cluster Mode的资源调度有一个基本的认识: 首先,运行一个Application需要Driver进程和一组Executor进程。在Standalone Cluster Mode下,Driver和Executor都是在Master的监护下给Worker发消息创建(Driver进程和Executor进程都需要分配内存和CPU,这就需要Maste</div> </li> <li><a href="/article/316.htm" title="linux上独立安装部署spark" target="_blank">linux上独立安装部署spark</a> <span class="text-muted">daizj</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AE%89%E8%A3%85/1.htm">安装</a><a class="tag" taget="_blank" href="/search/spark/1.htm">spark</a><a class="tag" taget="_blank" href="/search/1.4/1.htm">1.4</a><a class="tag" taget="_blank" href="/search/%E9%83%A8%E7%BD%B2/1.htm">部署</a> <div>下面讲一下linux上安装spark,以 Standalone Mode 安装   1)首先安装JDK   下载JDK:jdk-7u79-linux-x64.tar.gz  ,版本是1.7以上都行,解压 tar -zxvf jdk-7u79-linux-x64.tar.gz     然后配置 ~/.bashrc&nb</div> </li> <li><a href="/article/443.htm" title="Java 字节码之解析一" target="_blank">Java 字节码之解析一</a> <span class="text-muted">周凡杨</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%AD%97%E8%8A%82%E7%A0%81/1.htm">字节码</a><a class="tag" taget="_blank" href="/search/javap/1.htm">javap</a> <div>    一: Java 字节代码的组织形式   类文件 {     OxCAFEBABE ,小版本号,大版本号,常量池大小,常量池数组,访问控制标记,当前类信息,父类信息,实现的接口个数,实现的接口信息数组,域个数,域信息数组,方法个数,方法信息数组,属性个数,属性信息数组 } &nbs</div> </li> <li><a href="/article/570.htm" title="java各种小工具代码" target="_blank">java各种小工具代码</a> <span class="text-muted">g21121</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>1.数组转换成List import java.util.Arrays; Arrays.asList(Object[] obj); 2.判断一个String型是否有值 import org.springframework.util.StringUtils; if (StringUtils.hasText(str)) 3.判断一个List是否有值 import org.spring</div> </li> <li><a href="/article/697.htm" title="加快FineReport报表设计的几个心得体会" target="_blank">加快FineReport报表设计的几个心得体会</a> <span class="text-muted">老A不折腾</span> <a class="tag" taget="_blank" href="/search/finereport/1.htm">finereport</a> <div>一、从远程服务器大批量取数进行表样设计时,最好按“列顺序”取一个“空的SQL语句”,这样可提高设计速度。否则每次设计时模板均要从远程读取数据,速度相当慢!! 二、找一个富文本编辑软件(如NOTEPAD+)编辑SQL语句,这样会很好地检查语法。有时候带参数较多检查语法复杂时,结合FineReport中生成的日志,再找一个第三方数据库访问软件(如PL/SQL)进行数据检索,可以很快定位语法错误。 </div> </li> <li><a href="/article/824.htm" title="mysql linux启动与停止" target="_blank">mysql linux启动与停止</a> <span class="text-muted">墙头上一根草</span> <div>如何启动/停止/重启MySQL一、启动方式1、使用 service 启动:service mysqld start2、使用 mysqld 脚本启动:/etc/inint.d/mysqld start3、使用 safe_mysqld 启动:safe_mysqld&二、停止1、使用 service 启动:service mysqld stop2、使用 mysqld 脚本启动:/etc/inin</div> </li> <li><a href="/article/951.htm" title="Spring中事务管理浅谈" target="_blank">Spring中事务管理浅谈</a> <span class="text-muted">aijuans</span> <a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86/1.htm">事务管理</a> <div> Spring中事务管理浅谈 By Tony Jiang@2012-1-20 Spring中对事务的声明式管理 拿一个XML举例 [html]  view plain copy print ? <?xml version="1.0" encoding="UTF-8"?>&nb</div> </li> <li><a href="/article/1078.htm" title="php中隐形字符65279(utf-8的BOM头)问题" target="_blank">php中隐形字符65279(utf-8的BOM头)问题</a> <span class="text-muted">alxw4616</span> <div>php中隐形字符65279(utf-8的BOM头)问题 今天遇到一个问题. php输出JSON 前端在解析时发生问题:parsererror.   调试: 1.仔细对比字符串发现字符串拼写正确.怀疑是 非打印字符的问题. 2.逐一将字符串还原为unicode编码. 发现在字符串头的位置出现了一个 65279的非打印字符.        </div> </li> <li><a href="/article/1205.htm" title="调用对象是否需要传递对象(初学者一定要注意这个问题)" target="_blank">调用对象是否需要传递对象(初学者一定要注意这个问题)</a> <span class="text-muted">百合不是茶</span> <a class="tag" taget="_blank" href="/search/%E5%AF%B9%E8%B1%A1%E7%9A%84%E4%BC%A0%E9%80%92%E4%B8%8E%E8%B0%83%E7%94%A8%E6%8A%80%E5%B7%A7/1.htm">对象的传递与调用技巧</a> <div>    类和对象的简单的复习,在做项目的过程中有时候不知道怎样来调用类创建的对象,简单的几个类可以看清楚,一般在项目中创建十几个类往往就不知道怎么来看   为了以后能够看清楚,现在来回顾一下类和对象的创建,对象的调用和传递(前面写过一篇)   类和对象的基础概念:   JAVA中万事万物都是类 类有字段(属性),方法,嵌套类和嵌套接</div> </li> <li><a href="/article/1332.htm" title="JDK1.5 AtomicLong实例" target="_blank">JDK1.5 AtomicLong实例</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/thread/1.htm">thread</a><a class="tag" taget="_blank" href="/search/java%E5%A4%9A%E7%BA%BF%E7%A8%8B/1.htm">java多线程</a><a class="tag" taget="_blank" href="/search/AtomicLong/1.htm">AtomicLong</a> <div>JDK1.5 AtomicLong实例 类 AtomicLong 可以用原子方式更新的 long 值。有关原子变量属性的描述,请参阅 java.util.concurrent.atomic 包规范。AtomicLong 可用在应用程序中(如以原子方式增加的序列号),并且不能用于替换 Long。但是,此类确实扩展了 Number,允许那些处理基于数字类的工具和实用工具进行统一访问。  </div> </li> <li><a href="/article/1459.htm" title="自定义的RPC的Java实现" target="_blank">自定义的RPC的Java实现</a> <span class="text-muted">bijian1013</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/rpc/1.htm">rpc</a> <div>        网上看到纯java实现的RPC,很不错。         RPC的全名Remote Process Call,即远程过程调用。使用RPC,可以像使用本地的程序一样使用远程服务器上的程序。下面是一个简单的RPC 调用实例,从中可以看到RPC如何</div> </li> <li><a href="/article/1586.htm" title="【RPC框架Hessian一】Hessian RPC Hello World" target="_blank">【RPC框架Hessian一】Hessian RPC Hello World</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/Hello+world/1.htm">Hello world</a> <div>什么是Hessian The Hessian binary web service protocol makes web services usable without requiring a large framework, and without learning yet another alphabet soup of protocols. Because it is a binary p</div> </li> <li><a href="/article/1713.htm" title="【Spark九十五】Spark Shell操作Spark SQL" target="_blank">【Spark九十五】Spark Shell操作Spark SQL</a> <span class="text-muted">bit1129</span> <a class="tag" taget="_blank" href="/search/shell/1.htm">shell</a> <div>在Spark Shell上,通过创建HiveContext可以直接进行Hive操作   1. 操作Hive中已存在的表   [hadoop@hadoop bin]$ ./spark-shell Spark assembly has been built with Hive, including Datanucleus jars on classpath Welcom</div> </li> <li><a href="/article/1840.htm" title="F5 往header加入客户端的ip" target="_blank">F5 往header加入客户端的ip</a> <span class="text-muted">ronin47</span> <div>when HTTP_RESPONSE {if {[HTTP::is_redirect]}{         HTTP::header replace Location [string map {:port/ /} [HTTP::header value Location]]HTTP::header replace Lo</div> </li> <li><a href="/article/1967.htm" title="java-61-在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差. 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5," target="_blank">java-61-在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差. 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5,</a> <span class="text-muted">bylijinnan</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>思路来自: http://zhedahht.blog.163.com/blog/static/2541117420116135376632/ 写了个java版的 public class GreatestLeftRightDiff { /** * Q61.在数组中,数字减去它右边(注意是右边)的数字得到一个数对之差。 * 求所有数对之差的最大值。例如在数组</div> </li> <li><a href="/article/2094.htm" title="mongoDB 索引" target="_blank">mongoDB 索引</a> <span class="text-muted">开窍的石头</span> <a class="tag" taget="_blank" href="/search/mongoDB%E7%B4%A2%E5%BC%95/1.htm">mongoDB索引</a> <div>在这一节中我们讲讲在mongo中如何创建索引       得到当前查询的索引信息      db.user.find(_id:12).explain();        cursor: basicCoursor 指的是没有索引  &</div> </li> <li><a href="/article/2221.htm" title="[硬件和系统]迎峰度夏" target="_blank">[硬件和系统]迎峰度夏</a> <span class="text-muted">comsci</span> <a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F/1.htm">系统</a> <div>  从这几天的气温来看,今年夏天的高温天气可能会维持在一个比较长的时间内    所以,从现在开始准备渡过炎热的夏天。。。。    每间房屋要有一个落地电风扇,一个空调(空调的功率和房间的面积有密切的关系)    坐的,躺的地方要有凉垫,床上要有凉席       电脑的机箱</div> </li> <li><a href="/article/2348.htm" title="基于ThinkPHP开发的公司官网" target="_blank">基于ThinkPHP开发的公司官网</a> <span class="text-muted">cuiyadll</span> <a class="tag" taget="_blank" href="/search/%E8%A1%8C%E4%B8%9A%E7%B3%BB%E7%BB%9F/1.htm">行业系统</a> <div>后端基于ThinkPHP,前端基于jQuery和BootstrapCo.MZ 企业系统 轻量级企业网站管理系统 运行环境:PHP5.3+, MySQL5.0 系统预览 系统下载:http://www.tecmz.com 预览地址:http://co.tecmz.com 各种设备自适应 响应式的网站设计能够对用户产生友好度,并且对于</div> </li> <li><a href="/article/2475.htm" title="Transaction and redelivery in JMS (JMS的事务和失败消息重发机制)" target="_blank">Transaction and redelivery in JMS (JMS的事务和失败消息重发机制)</a> <span class="text-muted">darrenzhu</span> <a class="tag" taget="_blank" href="/search/jms/1.htm">jms</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1/1.htm">事务</a><a class="tag" taget="_blank" href="/search/%E6%89%BF%E8%AE%A4/1.htm">承认</a><a class="tag" taget="_blank" href="/search/MQ/1.htm">MQ</a><a class="tag" taget="_blank" href="/search/acknowledge/1.htm">acknowledge</a> <div>JMS Message Delivery Reliability and Acknowledgement Patterns http://wso2.com/library/articles/2013/01/jms-message-delivery-reliability-acknowledgement-patterns/ Transaction and redelivery in </div> </li> <li><a href="/article/2602.htm" title="Centos添加硬盘完全教程" target="_blank">Centos添加硬盘完全教程</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/centos/1.htm">centos</a><a class="tag" taget="_blank" href="/search/hardware/1.htm">hardware</a> <div>Linux的硬盘识别: sda        表示第1块SCSI硬盘 hda       表示第1块IDE硬盘 scd0      表示第1个USB光驱 一般使用“fdisk -l”命</div> </li> <li><a href="/article/2729.htm" title="yii2 restful web服务路由" target="_blank">yii2 restful web服务路由</a> <span class="text-muted">dcj3sjt126com</span> <a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/yii2/1.htm">yii2</a> <div>路由 随着资源和控制器类准备,您可以使用URL如 http://localhost/index.php?r=user/create访问资源,类似于你可以用正常的Web应用程序做法。 在实践中,你通常要用美观的URL并采取有优势的HTTP动词。 例如,请求POST /users意味着访问user/create动作。 这可以很容易地通过配置urlManager应用程序组件来完成 如下所示</div> </li> <li><a href="/article/2856.htm" title="MongoDB查询(4)——游标和分页[八]" target="_blank">MongoDB查询(4)——游标和分页[八]</a> <span class="text-muted">eksliang</span> <a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/MongoDB%E6%B8%B8%E6%A0%87/1.htm">MongoDB游标</a><a class="tag" taget="_blank" href="/search/MongoDB%E6%B7%B1%E5%88%86%E9%A1%B5/1.htm">MongoDB深分页</a> <div>转载请出自出处:http://eksliang.iteye.com/blog/2177567 一、游标         数据库使用游标返回find的执行结果。客户端对游标的实现通常能够对最终结果进行有效控制,从shell中定义一个游标非常简单,就是将查询结果分配给一个变量(用var声明的变量就是局部变量),便创建了一个游标,如下所示: > var </div> </li> <li><a href="/article/2983.htm" title="Activity的四种启动模式和onNewIntent()" target="_blank">Activity的四种启动模式和onNewIntent()</a> <span class="text-muted">gundumw100</span> <a class="tag" taget="_blank" href="/search/android/1.htm">android</a> <div>Android中Activity启动模式详解   在Android中每个界面都是一个Activity,切换界面操作其实是多个不同Activity之间的实例化操作。在Android中Activity的启动模式决定了Activity的启动运行方式。   Android总Activity的启动模式分为四种: Activity启动模式设置: <acti</div> </li> <li><a href="/article/3110.htm" title="攻城狮送女友的CSS3生日蛋糕" target="_blank">攻城狮送女友的CSS3生日蛋糕</a> <span class="text-muted">ini</span> <a class="tag" taget="_blank" href="/search/html/1.htm">html</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/html5/1.htm">html5</a><a class="tag" taget="_blank" href="/search/css/1.htm">css</a><a class="tag" taget="_blank" href="/search/css3/1.htm">css3</a> <div>在线预览:http://keleyi.com/keleyi/phtml/html5/29.htm   代码如下:   <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>攻城狮送女友的CSS3生日蛋糕-柯乐义<</div> </li> <li><a href="/article/3237.htm" title="读源码学Servlet(1)GenericServlet 源码分析" target="_blank">读源码学Servlet(1)GenericServlet 源码分析</a> <span class="text-muted">jzinfo</span> <a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/servlet/1.htm">servlet</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%BA%94%E7%94%A8/1.htm">网络应用</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%8D%8F%E8%AE%AE/1.htm">网络协议</a> <div>Servlet API的核心就是javax.servlet.Servlet接口,所有的Servlet 类(抽象的或者自己写的)都必须实现这个接口。在Servlet接口中定义了5个方法,其中有3个方法是由Servlet 容器在Servlet的生命周期的不同阶段来调用的特定方法。     先看javax.servlet.servlet接口源码:  package </div> </li> <li><a href="/article/3364.htm" title="JAVA进阶:VO(DTO)与PO(DAO)之间的转换" target="_blank">JAVA进阶:VO(DTO)与PO(DAO)之间的转换</a> <span class="text-muted">snoopy7713</span> <a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/VO/1.htm">VO</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a><a class="tag" taget="_blank" href="/search/po/1.htm">po</a> <div>  PO即 Persistence Object  VO即 Value Object  VO和PO的主要区别在于:  VO是独立的Java Object。  PO是由Hibernate纳入其实体容器(Entity Map)的对象,它代表了与数据库中某条记录对应的Hibernate实体,PO的变化在事务提交时将反应到实际数据库中。  实际上,这个VO被用作Data Transfer </div> </li> <li><a href="/article/3491.htm" title="mongodb group by date 聚合查询日期 统计每天数据(信息量)" target="_blank">mongodb group by date 聚合查询日期 统计每天数据(信息量)</a> <span class="text-muted">qiaolevip</span> <a class="tag" taget="_blank" href="/search/%E6%AF%8F%E5%A4%A9%E8%BF%9B%E6%AD%A5%E4%B8%80%E7%82%B9%E7%82%B9/1.htm">每天进步一点点</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E6%B0%B8%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">学习永无止境</a><a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/%E7%BA%B5%E8%A7%82%E5%8D%83%E8%B1%A1/1.htm">纵观千象</a> <div>/* 1 */ { "_id" : ObjectId("557ac1e2153c43c320393d9d"), "msgType" : "text", "sendTime" : ISODate("2015-06-12T11:26:26.000Z")</div> </li> <li><a href="/article/3618.htm" title="java之18天 常用的类(一)" target="_blank">java之18天 常用的类(一)</a> <span class="text-muted">Luob.</span> <a class="tag" taget="_blank" href="/search/Math/1.htm">Math</a><a class="tag" taget="_blank" href="/search/Date/1.htm">Date</a><a class="tag" taget="_blank" href="/search/System/1.htm">System</a><a class="tag" taget="_blank" href="/search/Runtime/1.htm">Runtime</a><a class="tag" taget="_blank" href="/search/Rundom/1.htm">Rundom</a> <div>System类 import java.util.Properties; /** * System: * out:标准输出,默认是控制台 * in:标准输入,默认是键盘 * * 描述系统的一些信息 * 获取系统的属性信息:Properties getProperties(); * * * */ public class Sy</div> </li> <li><a href="/article/3745.htm" title="maven" target="_blank">maven</a> <span class="text-muted">wuai</span> <a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a> <div>1、安装maven:解压缩、添加M2_HOME、添加环境变量path 2、创建maven_home文件夹,创建项目mvn_ch01,在其下面建立src、pom.xml,在src下面简历main、test、main下面建立java文件夹 3、编写类,在java文件夹下面依照类的包逐层创建文件夹,将此类放入最后一级文件夹 4、进入mvn_ch01 4.1、mvn compile ,执行后会在</div> </li> </ul> </div> </div> </div> <div> <div class="container"> <div class="indexes"> <strong>按字母分类:</strong> <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a> </div> </div> </div> <footer id="footer" class="mb30 mt30"> <div class="container"> <div class="footBglm"> <a target="_blank" href="/">首页</a> - <a target="_blank" href="/custom/about.htm">关于我们</a> - <a target="_blank" href="/search/Java/1.htm">站内搜索</a> - <a target="_blank" href="/sitemap.txt">Sitemap</a> - <a target="_blank" href="/custom/delete.htm">侵权投诉</a> </div> <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved. <!-- <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>--> </div> </div> </footer> <!-- 代码高亮 --> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script> <script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script> <link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/> <script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script> </body> </html>