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/1946577263839473664.htm" title="Qualcomm Linux 蓝牙指南学习--概述" target="_blank">Qualcomm Linux 蓝牙指南学习--概述</a> <span class="text-muted">专业开发者</span> <a class="tag" taget="_blank" href="/search/%E8%93%9D%E7%89%99/1.htm">蓝牙</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>前言QualcommTechnologies推出的Linux蓝牙指南详细介绍了基于QualcommRB3Gen2和IQ-9100Beta开发套件的蓝牙解决方案。该文档涵盖BlueZ和Fluoride协议栈的功能验证流程,支持蓝牙5.2核心规范,包括WCN6750/WCN6856/QCA6698AQ芯片组的特性。主要内容分为三部分:‌1.功能架构‌支持GAP、SPP、A2DP等10种蓝牙Profil</div> </li> <li><a href="/article/1946577264409899008.htm" title="Qualcomm Linux 蓝牙指南学习--入门指南" target="_blank">Qualcomm Linux 蓝牙指南学习--入门指南</a> <span class="text-muted">专业开发者</span> <a class="tag" taget="_blank" href="/search/%E8%93%9D%E7%89%99/1.htm">蓝牙</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a> <div>前言QualcommTechnologies推出的Linux蓝牙指南详细介绍了基于QualcommRB3Gen2和IQ-9100Beta开发套件的蓝牙解决方案。该文档涵盖BlueZ和Fluoride协议栈的功能验证流程,支持蓝牙5.2核心规范,包括WCN6750/WCN6856/QCA6698AQ芯片组的特性。主要内容分为三部分:‌1.功能架构‌支持GAP、SPP、A2DP等10种蓝牙Profil</div> </li> <li><a href="/article/1946576885475504128.htm" title="苹果UI 设计" target="_blank">苹果UI 设计</a> <span class="text-muted">蒙小萌1993</span> <a class="tag" taget="_blank" href="/search/ui/1.htm">ui</a><a class="tag" taget="_blank" href="/search/cocoa/1.htm">cocoa</a><a class="tag" taget="_blank" href="/search/macos/1.htm">macos</a> <div>不同平台不同框架以下是对iOSUIKit核心组件(AppDelegate、UIWindow、UIViewController、UIView、UINavigationController)的深度解析,依据Apple官方文档的设计哲学和实现原理:核心组件关系与架构或者通常为点击手机应用图标UIApplicationAppDelegateUIWindowrootViewControllerUITable</div> </li> <li><a href="/article/1946572977122373632.htm" title="C#-Linq源码解析之Concat" target="_blank">C#-Linq源码解析之Concat</a> <span class="text-muted">黑哥聊dotNet</span> <a class="tag" taget="_blank" href="/search/DotNet-Linq%E8%AF%A6%E8%A7%A3/1.htm">DotNet-Linq详解</a><a class="tag" taget="_blank" href="/search/linq/1.htm">linq</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>前言在Dotnet开发过程中,Concat作为IEnumerable的扩展方法,十分常用。本文对Concat方法的关键源码进行简要分析,以方便大家日后更好的使用该方法。使用Concat连接两个序列。假如我们有这样的两个集合,我们需要把两个集合进行连接!List lst = new List { "张三", "李四" };List lst2 = new List { "王麻子" };不使用Linq大</div> </li> <li><a href="/article/1946572598565466112.htm" title="C# Linq源码解析之Aggregate" target="_blank">C# Linq源码解析之Aggregate</a> <span class="text-muted">黑哥聊dotNet</span> <a class="tag" taget="_blank" href="/search/DotNet-Linq%E8%AF%A6%E8%A7%A3/1.htm">DotNet-Linq详解</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a><a class="tag" taget="_blank" href="/search/linq/1.htm">linq</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</a> <div>前言在Dotnet开发过程中,Aggregate作为IEnumerable的扩展方法,十分常用。本文对Aggregate方法的关键源码进行简要分析,以方便大家日后更好的使用该方法。使用Aggregate是对序列应用累加器的函数。看下面一段代码:List lst = new List() { "张三", "李四", "王麻子" };给了我们这样的一个list集合,我们想要得到"张三哈哈哈李四哈哈哈王</div> </li> <li><a href="/article/1946571459635769344.htm" title="Anime.js的cleanInlineStyles用法" target="_blank">Anime.js的cleanInlineStyles用法</a> <span class="text-muted"></span> <div>第一章:动画的“身后事”——我们为什么需要清理样式?在深入探讨cleanInlineStyles这个具体的工具函数之前,理解它所要解决的根本问题至关重要。这个问题源于JavaScript动画库的核心工作机制,尤其是像Anime.js这样直接与DOM(文档对象模型)交互的库。1.1Anime.js的工作原理:内联样式的魔法与诅咒Anime.js的强大之处在于其能够以极高的性能和灵活性来驱动网页动画1</div> </li> <li><a href="/article/1946569440225193984.htm" title="Spring中IOC和AOP实现原理" target="_blank">Spring中IOC和AOP实现原理</a> <span class="text-muted">Cat凯94</span> <a class="tag" taget="_blank" href="/search/Java%E5%9F%BA%E7%A1%80/1.htm">Java基础</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E6%A1%86%E6%9E%B6/1.htm">开发框架</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a> <div>目录IOCIOC实现方式BeanFactoryBeanFactory实现方式ApplicationContextApplicationContext实现方式基于XML的Spring项目:基于SpringBoot:初始化过程AOPJDK动态代理CGLIB动态代理JDK动态代理与CGLIB动态代理的区别实现方式相关注解核心方法执行优先级IOC核心思想:将原本在程序中手动创建对象的控制权,交由Sprin</div> </li> <li><a href="/article/1946567803091873792.htm" title="法国诺曼底疫情指数超警戒线!网红专家神预测有无第2波疫情" target="_blank">法国诺曼底疫情指数超警戒线!网红专家神预测有无第2波疫情</a> <span class="text-muted">法国话事姐</span> <div>近日,德国威斯特法伦地区肉类联合加工厂Tönnies爆发集中感染事件。目前已接受新冠病毒检测的1160名员工中,约有730人检测结果呈阳性,感染比例高达三分之二!英国威尔士一处鸡肉加工厂18日也出现聚集性疫情,已有近百人确诊感染。不仅如此,法国诺曼底地区疫情也出现了反复。这一系列事件引发不少“第二波疫情”是否来临的担忧。法国是不是有点太松懈?法国卫生部门6月19日发布统计数据称,自5月启动“解封”</div> </li> <li><a href="/article/1946567169949102080.htm" title="奥斯卡一如既往上头条" target="_blank">奥斯卡一如既往上头条</a> <span class="text-muted">天秤座的心思</span> <div>学院奖(AcademyAwards)全名学院功绩奖(AcademyAwardofMerit),俗称奥斯卡金像,每年由美国电影艺术与科学学院(AMPAS:TheAcademyofMotionPictureArtsandSciences)组织授予颁发,旨在鼓励过去一年间的优秀电影创作。学院奖的颁发不仅是年度美国电影界最为重要的活动,同时学院奖也是世界上最受瞩目的电影奖项之一,其目前共设有24类不同奖项</div> </li> <li><a href="/article/1946567041808920576.htm" title="达梦数据库运维-DM8到ORACLE11g创建DBLINK" target="_blank">达梦数据库运维-DM8到ORACLE11g创建DBLINK</a> <span class="text-muted"></span> <div>DM8到ORACLE11g创建DBLINK一、安装Oracle11g客户端安装配置1)解压安装客户端进入/dm/创建oracle客户端目录mkdir-p/dm8/oracleclient/chowndmdba.dinstall-R/dm8/oracleclient/cd/dm8/oracleclient/tar-xvfdbclt11204_x64_RHEL7U4_x64.tar.gz2)将orac</div> </li> <li><a href="/article/1946563514638331904.htm" title="iOS移动开发:自定义键盘的实现" target="_blank">iOS移动开发:自定义键盘的实现</a> <span class="text-muted">移动开发前沿</span> <a class="tag" taget="_blank" href="/search/%E7%A7%BB%E5%8A%A8%E7%AB%AF%E5%BC%80%E5%8F%91%E5%AE%9D%E5%85%B8/1.htm">移动端开发宝典</a><a class="tag" taget="_blank" href="/search/ios/1.htm">ios</a><a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%A4%96%E8%AE%BE/1.htm">计算机外设</a><a class="tag" taget="_blank" href="/search/cocoa/1.htm">cocoa</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a> <div>iOS移动开发:自定义键盘的实现关键词:iOS移动开发、自定义键盘、UITextInputTraits、UIInputViewController、键盘布局、事件处理摘要:本文围绕iOS移动开发中自定义键盘的实现展开。首先介绍了自定义键盘在iOS开发中的背景、目的和适用读者,接着阐述了核心概念如UITextInputTraits和UIInputViewController等及其联系,详细讲解了自定</div> </li> <li><a href="/article/1946560994092314624.htm" title="C#语法基础总结(超级全面)(二)" target="_blank">C#语法基础总结(超级全面)(二)</a> <span class="text-muted">inwith</span> <a class="tag" taget="_blank" href="/search/C%23%E8%AF%AD%E6%B3%95%E5%9F%BA%E7%A1%80/1.htm">C#语法基础</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">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>文章目录c#语法基本元素关键字操作符(operator)类型转换标识符(Identifier)语句try语句迭代语句(循环语句)索引器文本(字面值)五大数据类型引用类型:值类型:变量、对象与内存装箱和拆箱类类的实例化类的三大成员(属性、方法、事件)属性(property)方法(函数)方法参数值参数引用参数输出参数数组参数具名参数可选参数扩展方法(this参数)方法的重载构造器(constructo</div> </li> <li><a href="/article/1946559228885921792.htm" title="C#中的LINQ解析" target="_blank">C#中的LINQ解析</a> <span class="text-muted">三千道应用题</span> <a class="tag" taget="_blank" href="/search/C%23%E5%AD%A6%E6%97%A0%E6%AD%A2%E5%A2%83/1.htm">C#学无止境</a><a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a> <div>本文仅作为参考大佬们文章的总结。LINQ(LanguageIntegratedQuery,语言集成查询)是C#中一项革命性的技术,它将查询功能直接集成到C#语言中,使开发者能够以声明式的方式查询各种数据源。LINQ提供了一种统一的语法来查询和操作不同类型的数据,包括内存中的集合、数据库、XML文档等,极大地简化了数据处理流程。一、LINQ概述与核心概念1.LINQ的定义与价值LINQ是.NETFr</div> </li> <li><a href="/article/1946553055369555968.htm" title="企业级3D TLC?看英特尔专家怎么说!" target="_blank">企业级3D TLC?看英特尔专家怎么说!</a> <span class="text-muted">weixin_33691817</span> <div>也许有人会说,3DNAND有什么好说的,三星早在前年就发布了3DV-NAND,就是基于3DTLC设计的,48层,单Die容量256Gb;此后,SKHynix、东芝/闪迪、Intel/美光等豪门都开始涉足3DNAND产品。但需要提醒的是,在这里谈论的是企业级产品市场应用。考虑到频繁读写,以及企业级应用场景对可靠性、稳定性的需求,专业人士指出,这是完全不同的市场。顺便说一句:企业级闪存产品应用,2DM</div> </li> <li><a href="/article/1946548895345602560.htm" title="Unity使用Navigation实现玩家移动到鼠标点击位置" target="_blank">Unity使用Navigation实现玩家移动到鼠标点击位置</a> <span class="text-muted"></span> <div>如何使用Navigation实现玩家移动到鼠标点击位置。1.打开Navigation窗口。2.烘焙游戏场景:(1)在Hierarchy窗口中选择可以行走的区域,将其设置为NavigationStatic,然后打开Navigation窗口,选择Object,勾选NavigationStatic,将NavigationArea设置为Walkable。接下来,选择Bake,点击下面的Bake按键,稍等一</div> </li> <li><a href="/article/1946548833190211584.htm" title="《幸福的科学》第四章 Harriet打卡 20211018" target="_blank">《幸福的科学》第四章 Harriet打卡 20211018</a> <span class="text-muted">Harriet温暖眼瞳</span> <div>一、请回答一下3道思考题:001:你过去做事有“福流”的状态吗,是什么事情?跳舞,工作上完成大的项目,做主持人时行云流水地带动整个气氛,与家人聊天的时候002:内在动机是如何理解,分享一下你参与读书会的动机或者工作的动机是什么?内在动机是指由个体内在需要引起的动机,例如,学生觉得学习有意义或有趣就会积极主动地学习,这就是内在动机。我参与读书的动机是想修炼自己,让自己更优秀。003:读书能让你感受到</div> </li> <li><a href="/article/1946548388451381248.htm" title="关于Spring RestTemplate" target="_blank">关于Spring RestTemplate</a> <span class="text-muted"></span> <div>一、概述RestTemplate是SpringFramework提供的一个同步HTTP客户端工具,用于简化与RESTfulAPI的交互。它封装了底层HTTP通信细节,提供了统一的API来发送各种HTTP请求(GET、POST、PUT、DELETE等),并自动处理响应数据的序列化和反序列化。二、依赖配置如果使用Maven项目,需要在pom.xml中添加以下依赖:xml  org.springfram</div> </li> <li><a href="/article/1946544603960242176.htm" title="详细介绍一下OpenAI的API使用方法" target="_blank">详细介绍一下OpenAI的API使用方法</a> <span class="text-muted">alankuo</span> <a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>以下是详细的OpenAIAPI使用方法:获取API密钥访问OpenAI官方网站(https://platform.openai.com/)并注册账号.登录后,点击右上角的个人资料名称或图标,选择“ViewAPIKeys”.在API密钥页面,点击“Createnewsecretkey”来创建新的API密钥,将其妥善保存,因为此密钥仅在生成时显示一次.安装OpenAI库在命令行中使用pipinstal</div> </li> <li><a href="/article/1946540822824546304.htm" title="Python 桌面版 数独游戏(一版)" target="_blank">Python 桌面版 数独游戏(一版)</a> <span class="text-muted">香蕉可乐荷包蛋</span> <a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%8B%AC/1.htm">数独</a><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>设计思路详解:Python桌面版数独游戏1.功能需求分析构建一个9x9的数独游戏界面。支持玩家手动输入数字。提供两个按钮:“重新开始本局”:恢复当前棋盘到初始状态(保留原始数字)。“生成新棋局”:生成一个新的随机数独题目。使用标准库实现,无需额外安装。2.技术选型使用tkinter:Python标准GUI库,适合小型桌面应用。使用random和copy:用于生成数独题目和深拷贝原始题目。采用回溯算</div> </li> <li><a href="/article/1946540696399835136.htm" title="【vLLM 学习】Encoder Decoder Multimodal" target="_blank">【vLLM 学习】Encoder Decoder Multimodal</a> <span class="text-muted">HyperAI超神经</span> <a class="tag" taget="_blank" href="/search/vLLM/1.htm">vLLM</a><a class="tag" taget="_blank" href="/search/vLLM/1.htm">vLLM</a><a class="tag" taget="_blank" href="/search/KV%E7%BC%93%E5%AD%98/1.htm">KV缓存</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/1.htm">大语言模型</a><a class="tag" taget="_blank" href="/search/%E6%8E%A8%E7%90%86%E5%8A%A0%E9%80%9F/1.htm">推理加速</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98%E7%AE%A1%E7%90%86/1.htm">内存管理</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E6%BA%90%E9%A1%B9%E7%9B%AE/1.htm">开源项目</a><a class="tag" taget="_blank" href="/search/%E5%9C%A8%E7%BA%BF%E6%95%99%E7%A8%8B/1.htm">在线教程</a> <div>vLLM是一款专为大语言模型推理加速而设计的框架,实现了KV缓存内存几乎零浪费,解决了内存管理瓶颈问题。更多vLLM中文文档及教程可访问→https://vllm.hyper.ai/*在线运行vLLM入门教程:零基础分步指南源码examples/offline_inference/encoder_decoder_multimodal.py#SPDX-License-Identifier:Apach</div> </li> <li><a href="/article/1946531619640766464.htm" title="PAM配置文件解析,配置文件优先级" target="_blank">PAM配置文件解析,配置文件优先级</a> <span class="text-muted">Yana.com</span> <a class="tag" taget="_blank" href="/search/PAM/1.htm">PAM</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a> <div>/etc/pam.d/目录配置文件1.核心配置文件(1)system-auth作用:系统默认认证策略,被其他服务(如login、sshd)通过include引用。典型内容:authrequiredpam_env.soauthsufficientpam_unix.sotry_first_passaccountrequiredpam_unix.sopasswordrequiredpam_unix.so</div> </li> <li><a href="/article/1946531240354050048.htm" title="Java Script学习笔记(1)" target="_blank">Java Script学习笔记(1)</a> <span class="text-muted">MERRYME2</span> <a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>JavaScript学习笔记(1)(课程:黑马程序员)JavaScript是什么JavaScript是世界最流行的语言之一,是一种运行在客户端的脚本语言(Script是脚本的意思)脚本语言:不需要编译,运行过程中由js解释器(js引擎)逐行来进行解释并执行现在也可以基于Node.js技术进行服务器端编程JS的组成ECMAScript(JavaScript语法)和DOM(页面文档对象)和BOM(浏览</div> </li> <li><a href="/article/1946529131827097600.htm" title="(05-29) textView和textField设置光标后移" target="_blank">(05-29) textView和textField设置光标后移</a> <span class="text-muted">shushuzhen</span> <div>//这里设置光标位置,让光标位置后移10textField.leftView=[[UIViewalloc]initWithFrame:CGRectMake(0,0,10,0)];textField.leftViewMode=UITextFieldViewModeAlways;//这里设置光标位置,让光标位置后移10textView.textContainer.lineFragmentPadding</div> </li> <li><a href="/article/1946526448860852224.htm" title="Synergizing RAG and Reasoning: A Systematic Review-RAG与推理能力深度结合-新方向" target="_blank">Synergizing RAG and Reasoning: A Systematic Review-RAG与推理能力深度结合-新方向</a> <span class="text-muted">数据分析能量站</span> <a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a> <div>欢迎关v:数据分析能量站0论文小结一、研究背景与核心问题大语言模型(LLM)在处理复杂任务时面临两大瓶颈:知识局限性:纯LLM存在“知识幻觉”(编造事实)和“领域知识缺口”;推理浅度:传统检索增强生成(RAG)仅通过关键词匹配获取信息,无法处理多跳推理、语义歧义等复杂需求。核心主张:RAG与推理的深度整合(RAG+Reasoning)是突破上述瓶颈的关键,通过“检索提供实时知识,推理赋予逻辑能力”</div> </li> <li><a href="/article/1946518195426881536.htm" title="低调!赵丽颖产后现身,全副武装宛如路人?" target="_blank">低调!赵丽颖产后现身,全副武装宛如路人?</a> <span class="text-muted">莫舒伊</span> <div>作者:伊伊Vivien阅读时间:30s图片发自App7月16日凌晨四点,赵丽颖一人身穿蓝紫色长裙和白色帆布鞋现身北京机场,戴着帽子口罩的她包裹严实,身材苗条腰肢纤细,状态十分不错。据悉,赵丽颖自3月8日诞下儿子后一直处于休息调养阶段,此前未有公开露面。图片发自App赵丽颖与粉丝在机场对话赵丽颖:你们起的也太早了吧,我的天呐。男粉丝1:我们没睡。男粉丝2:你们懂今天睡过头的感受吗??没有凌晨四点的觉</div> </li> <li><a href="/article/1946514600124018688.htm" title="【React Native】动态路由与参数传递" target="_blank">【React Native】动态路由与参数传递</a> <span class="text-muted">秀秀_heo</span> <a class="tag" taget="_blank" href="/search/%E8%B7%A8%E7%AB%AF%E5%BC%80%E5%8F%91/1.htm">跨端开发</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/native/1.htm">native</a><a class="tag" taget="_blank" href="/search/react.js/1.htm">react.js</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a> <div>动态路由[id].js文件是个动态路由文件。使用:/courses/1/courses/2都是可以匹配上的,也就说它的最后一个参数是不确定的,可以是任意值。参数传递import{View,Text,StyleSheet,TouchableOpacity}from"react-native";import{Link,useRouter}from"expo-router";exportdefaultf</div> </li> <li><a href="/article/1946502956861943808.htm" title="view的初始化及控件的懒加载" target="_blank">view的初始化及控件的懒加载</a> <span class="text-muted">lifeLL</span> <div>@implementationPGIndexBannerSubiew-(instancetype)initWithFrame:(CGRect)frame{self=[superinitWithFrame:frame];if(self){[selfaddSubview:self.mainImageView];[selfaddSubview:self.coverView];}returnself;}-</div> </li> <li><a href="/article/1946495945516576768.htm" title="【jquery详细讲解】" target="_blank">【jquery详细讲解】</a> <span class="text-muted">ᝰ落念英</span> <a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</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/web/1.htm">web</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/jQuery/1.htm">jQuery</a><a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a> <div>(一)、什么是jQueryjQuery是对javascript的一种封装--js的函数库。用于客户端的开发,由美国人在2001年1月推出。(二)、jQuery与javascript的区别:1、本质上的区别:jQuery是一个函数库,基于js语言编写出来的框架,实质上还是属于js。2、代码书写不同,jq更简单。3、使用方法不同:使用jQuery和javascript分别加载DOM,js只执行一次,j</div> </li> <li><a href="/article/1946494304436416512.htm" title="cf1925B&C" target="_blank">cf1925B&C</a> <span class="text-muted"></span> <div>B.https://codeforces.com/contest/1925/problem/B题目背景:将x划分为n个数,使x个数字之间有最大的gcd。数据范围:1#defineiosccios::sync_with_stdio(false),cin.tie(0),cout.tie(0)#defineendl'\n'#defineme(a,x)memset(a,x,sizeofa)#definea</div> </li> <li><a href="/article/1946491656568107008.htm" title="frida objection注入时frida.core.RPCException: ReferenceError: ‘ObjC‘ is not defined解决" target="_blank">frida objection注入时frida.core.RPCException: ReferenceError: ‘ObjC‘ is not defined解决</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/android/1.htm">android</a> <div>最新的17.0.xx版本frida进行objection注入时会报错PSC:\Users\19583>objection-gcom.example.hellojniexploreC:\Users\19583\AppData\Local\Programs\Python\Python312\Lib\site-packages\objection\utils\update_checker.py:7:Us</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>