JS高程:读书摘要(十六)XML

一、 XML

1.1 什么是XML
  • 曾有一段时间,XML 是互联网上传输结构化数据的事实标准,突出的特点是服务器与服务器间通信。后来更多采用JSON来读写结构化数据。
  • XML 指可扩展标记语言(EXtensible Markup Language
  • XML 的设计宗旨是结构化、存储和传输数据,焦点是数据的内容;而非显示数据(HTML)。
  • XML 仅仅是纯文本而已,有能力处理纯文本的软件都可以处理XML
  • XML 没有预定义的标签,允许创作者自定义标签和文档结构。
1.2 XML用途
  • XML 把数据从 HTML 分离

如果你需要在 HTML 文档中显示动态数据,那么每当数据改变时将花费大量的时间来编辑 HTML,通过 XML,数据能够存储在独立的 XML 文件中。通过使用几行 JavaScript,你就可以读取一个外部 XML文件,然后更新 HTML 中的数据内容。

  • XML 简化数据共享

XML 数据以纯文本格式进行存储,因此提供了一种独立于软件和硬件的数据存储方法。这让创建不同应用程序可以共享的数据变得更加容易。

  • XML 兼容性强

通过 XML,可以在不兼容的系统之间轻松地交换数据。不同的应用程序都能够访问您的数据,不仅仅在 HTML 页中,也可以从XML 数据源中进行访问。通过 XML,您的数据可供各种阅读设备使用(手持的计算机、语音设备、新闻阅读器等),还可以供盲人或其他残障人士使用。

1.3 XML结构
 
// 第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码
 // 描述文档的根元素
    George
    John
    Reminder
    Don't forget the meeting! // 4个子元素
  // 根元素结尾
1.4 XML语法
  • 所有 XML 元素都须有关闭标签。
  • XML 标签对大小写敏感。在 XML 中,标签 与标签 是不同的。必须使用相同的大小写来编写打开标签和关闭标签。
  • XML必须正确地嵌套,且必须有根元素(必须有一个元素是所有其他元素的父元素)
  • XML 的属性值须加引号;
  • 实体引用,<>&'"来引用< > & ' "。
  • 注释与HTML一样;<!-- -->
  • XML 中,空格会被保留。以 LF 存储换行,对应ASCII中转义字符\n
1.5 XML元素
  • 元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性。
  • 命名规则
    • 名称可以含字母、数字以及其他的字符,但不能以数字或者标点符号开始。
    • 名称不能以字符 “xml”(或者 XMLXml)开始,不能包含空格。
    • 建议是有下划线连接_,不建议是有-.:连接语义标签。会被一些软件误解析。
1.6 XML属性
  • 属性值必须被引号包围,单引号和双引号均可。
  • 如果属性值本身包含双引号,那么有必要使用单引号包围它
  • 如果信息感觉起来很像数据,应该尽量避免使用属性,改为使用子元素。元数据(有关数据的数据)应当存储为属性,而数据本身应当存储为元素。

二、 XLST

2.1 XLS
  • XSL 指扩展样式表语言(EXtensible Stylesheet )
  • XSL = XML 样式表。(亦同csshtml
  • XSL 包括三部分:
    • XSLT:一种用于转换 XML 文档的语言。
    • XPath:一种用于在 XML 文档中导航的语言。
    • XSL-FO:一种用于格式化 XML 文档的语言。

  // 外链XSL文件  

  
    Belgian Waffles
    $5.95
    
       two of our famous Belgian Waffles
    
    650
  

把文档声明为 XSL 样式表的根元素是


// 或者

如需访问 XSLT 的元素、属性以及特性,我们必须在文档顶端声明 XSLT 命名空间。例:xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

2.2 XLST简介
  • XSLTXSL 转换(XSL Transformations),可将一种 XML 文档转换为另外一种 XML 文档(或者说是可被浏览器识别的其他类型的文档)。使用 XPathXML 文档中进行导航。
  • 通过 XSLT,可以向或者从输出文件添加或移除元素和属性。您也可重新排列元素,执行测试并决定隐藏或显示哪个元素,等等。
  • 描述转化过程的一种通常的说法是,XSLTXML 源树转换为 XML 结果树。
2.3 XLST转换

例:我们现在要把下面这个 XML 文档("cdcatalog.xml")转换为 XHTML



  
    Empire Burlesque
    Bob Dylan
    USA
    Columbia
    10.90
    1985
  
  ...
  ...
  ...

然后创建一个带有转换模板的 XSL 样式表("cdcatalog.xsl"




  
  
    

My CD Collection

Title Artist

XML 文档("cdcatalog.xml")添加XSL 样式表引用,如果您使用的浏览器兼容 XSLT,它会很顺利地把 XML 转换为 XHTML




  
    Empire Burlesque
    Bob Dylan
    USA
    Columbia
    10.90
    1985
  

转化后的展示
2.5 XSLT 元素

元素用于构建模板。match 属性用于关联 XML 元素和模板。match 属性也可用来为整个文档定义模板。match 属性的值是 XPath 表达式(举例,match="/" 定义整个文档)。元素内部的内容定义了写到输出结果的 HTML 代码。


// 由于 XSL 样式表本身也是一个 XML 文档,因此它总是由 XML 声明起始:

// 定义此文档是一个 XSLT 样式表文档(连同版本号和 XSLT 命名空间属性)

// xsl:template 元素定义了一个模板。而 match="/" 属性则把此模板与 XML 源文档的根相联系。
...
...
...


2.6 XSLT 元素

元素用于提取某个选定节点的值,并把值添加到转换的输出流中:


    
    

// 选定了XML中catalog/cd/title元素的值 输出在这个td中。
// 这里只捕获了一个匹配的元素 使用下面的for-each可以捕获全部
2.7 XSLT 元素

元素可用于选取指定的节点集中的每个 XML 元素。


  // 在 xls:for-each 的select属性上定义需要循环的节点
    
        
        
    

  • 结果过滤

  • 合法的过滤运算符:= (等于) != (不等于) < (小于) > (大于)
2.8 XSLT 元素

如需对结果进行排序,只要简单地在 XSL 文件中的 元素内部添加一个 元素:



// select 属性指示需要排序的 XML 元素。
    
        
        
    

2.9 XSLT 元素

元素用于放置针对 XML 文件内容的条件测试。



// 仅仅会输出价格高于 10 的 CD 的 title 和 artist 元素。
   
        
        
   


2.10 XSLT 元素

XSLT 元素用于结合 来表达多重条件测试。



    
    
        
            
             // 价格大于10的artist有背景
        
        
            // 可以多个判断条件 价格大于9时小于10时 另外一种背景
             
        
        
            
        
    


2.11 XSLT 元素

元素可把一个模板应用于当前的元素或者当前元素的子节点。







My CD Collection

//在这里应用模板

// 应用在哪些元素

Title:
// 怎么应用
Artist:

三、 XLST高级

之前讲到的是如何使用 XSLT 将某个 XML 文档转换为 XHTML。我们是通过以下途径完成这个工作的:向 XML 文件添加 XSL 样式表,并通过浏览器完成转换。但是在无法识别XSLT的浏览器这种方法就无法奏效,更通用的方法是使用 JavaScript 来完成转换。通过使用 JavaScript,我们可以进行浏览器确认测试并根据浏览器和使用者的需求来使用不同的样式表。

  • XSLT - 客户端

之前是在xml文件外联xsl文件然后由浏览器进行转换,现在可以使用JS直接完成加载与转换。

// Load XML 
var xml = new ActiveXObject("Microsoft.XMLDOM")
xml.async = false // 是否异步加载 默认为true
xml.load("cdcatalog.xml")

// Load XSL
var xsl = new ActiveXObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load("cdcatalog.xsl")

// Transform
document.write(xml.transformNode(xsl))
  • XSLT - 在服务器上

JavaScript 解决方案无法工作于没有 XML解析器的浏览器。为了让 XML 数据适用于任何类型的浏览器,我们必须在服务器上对 XML 文档进行转换,然后将其作为 XHMTL 发送到浏览器。XSLT 的设计目标之一是使数据在服务器上从一种格式转换到另一种格式成为可能,并向所有类型的浏览器返回可读的数据。

<%
'Load XML
set xml = Server.CreateObject("Microsoft.XMLDOM")
xml.async = false
xml.load(Server.MapPath("cdcatalog.xml"))

'Load XSL
set xsl = Server.CreateObject("Microsoft.XMLDOM")
xsl.async = false
xsl.load(Server.MapPath("cdcatalog.xsl"))

'Transform file
Response.Write(xml.transformNode(xsl))
%>

// ASP写法

四、 XPath

XPath 中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。




  Harry Potter
  29.99


  Learning XML
  39.95


其中(文档节点)29.99 (元素节点)lang="eng"(属性节点),39.95"en"等属于基本值。

节点关系也存在与HTML一样的,父、子、同胞、先辈、后代。

4.1 语法

XPath 使用路径表达式来选取 XML 文档中的节点或节点集。

表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore 选取根元素 bookstore。以/开头,代表着是绝对路径。
bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个book 元素。
/bookstore/book[position()<3] 选取最前面的两个(所在位置小于3)属于 bookstore 元素的子元素的 book元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有拥有值为 eng 的 lang 属性 title 元素
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素中 price > 35book元素
/bookstore/book[price>35.00]/title 选取 bookstore 元素的所有 book 元素中 price > 35book元素下的title元素。
/bookstore/* 选取 bookstore 元素的所有子元素
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性title 元素。
node() 匹配任何类型的节点。
@* 匹配任何属性节点。
//title | //price 选取文档中的所有 titleprice元素。
4.2 轴

轴可定义相对于当前节点的节点集。

轴名称 结果
ancestor 选取当前节点的所有先辈(父、祖父等)。
ancestor-or-self 选取当前节点的所有先辈(父、祖父等)以及当前节点本身。
attribute 选取当前节点的所有属性。
child 选取当前节点的所有子元素。
descendant 选取当前节点的所有后代元素(子、孙等)。
descendant-or-self 选取当前节点的所有后代元素(子、孙等)以及当前节点本身。
following 选取文档中当前节点的结束标签之后的所有节点。
namespace 选取当前节点的所有命名空间节点。
parent 选取当前节点的父节点。
preceding 选取文档中当前节点的开始标签之前的所有节点。
preceding-sibling 选取当前节点之前的所有同级节点。
self 选取当前节点。
4.3 步

每个步均根据当前节点集之中的节点来进行计算。语法:轴名称::节点测试[谓语]

例子 结果
child::book 选取所有属于当前节点的子元素的 book节点。
attribute::lang 选取当前节点的 lang 属性。
child::* 选取当前节点的所有子元素。
attribute::* 选取当前节点的所有属性。
child::text() 选取当前节点的所有文本子节点。
child::node() 选取当前节点的所有子节点。
descendant::book 选取当前节点的所有 book 后代。
ancestor::book 选择当前节点的所有 book 先辈。
ancestor-or-self::book 选取当前节点的所有 book先辈以及当前节点(如果此节点是 book 节点)
child::*/child::price 选取当前节点的所有 price孙节点。
4.4 XPath 运算符

区别于常规运算符的有:

运算符 描述 实例 返回值
| 计算两个节点集 //book | //cd 返回所有拥有 book 和 cd 元素的节点集
div 除法 8 div 4 2
or price=9.80 or price=9.70 price等于9.80或9.70时返回true
and price>9.00 and price<9.90 price在9.00 - 9.90之间返回true
mod 求模 5 mod 2 1
4.5 加载 XML 文档

所有现代浏览器都支持使用 XMLHttpRequest 来加载 XML 文档的方法

var xhr = new XMLHttpRequest
// 针对IE 5 和 6
var xhr = new ActiveXObject("Microsoft.XMLHTTP")
4.6 选取节点
xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE,null);
// IE
xmlDoc.selectNodes(xpath);

五、 XML & JavaScript

5.1 XMLHttpRequest 对象

XMLHttpRequest 对象用于在后台与服务器交换数据。创建XMLHttpRequest 对象的语法见4.5

  • 在不重新加载页面的情况下更新网页
  • 在页面已加载后从服务器请求数据
  • 在页面已加载后从服务器接收数据
  • 在后台向服务器发送数据
var xmlhttp;
function loadXMLDoc(url){
    xmlhttp=null;
    if (window.XMLHttpRequest){
    // code for all new browsers
        xmlhttp=new XMLHttpRequest();
    } else if (window.ActiveXObject){
    // code for IE5 and IE6
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    }
    if (xmlhttp!=null) {
        xmlhttp.onreadystatechange=state_Change;
        xmlhttp.open("GET",url,true); // 第三个参数规定请求是否异步处理
        // true 表示脚本会在 send() 方法之后继续执行,而不等待来自服务器的响应。
        xmlhttp.send(null);
    } else {
        alert("Your browser does not support XMLHTTP.");
    }
}

function state_Change(){
    if (xmlhttp.readyState==4) {
      // 4 = "loaded"
        if (xmlhttp.status==200){
        // 200 = OK
        // ...our code here...
        } else {
            alert("Problem retrieving XML data");
        }
    }
}
5.2 加载并解析XML 文件
// 使用XMLHttpRequest 对象
xmlhttp.open("GET","/example/xmle/note.xml",false); // 加载
xmlhttp.send();
xmlDoc=xmlhttp.responseXML; // 获取

// IE
var xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async="false";
xmlDoc.load("note.xml");

// Firefox 及 其他浏览器
var xmlDoc=document.implementation.createDocument("","",null);
xmlDoc.async="false";
xmlDoc.load("note.xml");

// 解析
document.getElementById("to").innerHTML=
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;
5.3 加载并解析XML 字符串
// 使用浏览器提供的解析方法
var txt="";
txt=txt+"George";
txt=txt+"John";
txt=txt+"Reminder";
txt=txt+"Don't forget the meeting!";
txt=txt+"";

if (window.DOMParser) { // 现代浏览器
  parser=new DOMParser();
  xmlDoc=parser.parseFromString(txt,"text/xml");
} else { // Internet Explorer
  xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
  xmlDoc.async="false";
  xmlDoc.loadXML(txt);
}

// 解析
document.getElementById("to").innerHTML=
xmlDoc.getElementsByTagName("to")[0].childNodes[0].nodeValue;

六、 XML DOM

6.1 XML DOM 常用属性

x 是一个节点对象

  • x.nodeName - x 的名称
  • x.nodeValue - x 的值
  • x.parentNode - x 的父节点
  • x.childNodes -x 的子节点
  • x.attributes - x 的属性节点
6.2 XML DOM 方法
  • x.getElementsByTagName(name)- 获取带有指定标签名称的所有元素
  • x.appendChild(node) - 向 x 插入子节点
  • x.removeChild(node) - 从 x 删除子节点

xmlDoc- 由解析器创建的 XML DOM 也能调用这些方法。

// 从 元素获取文本的 JavaScript 代码:
txt=xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue
</code></pre> 
 <h5>6.3 访问节点</h5> 
 <p>可以通过三种方法来访问节点:</p> 
 <ul> 
  <li>通过使用 <code>getElementsByTagName()</code> 方法,返回的是一个<code>NodeList</code> </li> 
 </ul> 
 <pre><code class="js">// 返回 x 元素下的所有 <title> 元素:
x.getElementsByTagName("title");
// 返回 XML 文档中的所有 <title> 元素
xmlDoc.getElementsByTagName("title");
</code></pre> 
 <ul> 
  <li>通过循环(遍历)节点树</li> 
 </ul> 
 <pre><code class="js">var x=xmlDoc.getElementsByTagName("title");
// 此时的x是一个节点列表 (node list)
var y = x[2] 
// 通过下标获取单个节点

for (i=0;i<x.length;i++) { 
  document.write(x[i].childNodes[0].nodeValue);
  document.write("<br />");
}
// 通过nodelist的length属性遍历节点

for (i=0;i<x.length;i++) { 
  if (x[i].nodeType==1) {
      document.write(x[i].nodeName);
      document.write("<br />");
  } 
}
// 通过nodetType来遍历元素节点
</code></pre> 
 <ul> 
  <li>通过利用节点的关系在节点树中导航</li> 
 </ul> 
 <pre><code class="js">x=xmlDoc.getElementsByTagName("book")[0].childNodes;
y=xmlDoc.getElementsByTagName("book")[0].firstChild;
z=y.nextSibling;
</code></pre> 
 <h5>6.4 节点属性及操作</h5> 
 <ul> 
  <li> <p><code>nodeName</code></p> 
   <ul> 
    <li> <code>nodeName</code> 是只读的</li> 
    <li>元素节点的 <code>nodeName</code> 与标签名相同</li> 
    <li>属性节点的 <code>nodeName</code> 是属性的名称</li> 
    <li>文本节点的 <code>nodeName</code> 永远是<code>#text</code> </li> 
    <li>文档节点的 <code>nodeName</code> 永远是 <code>#document</code> </li> 
   </ul> </li> 
  <li> <p><code>nodeValue</code></p> 
   <ul> 
    <li>元素节点的 <code>nodeValue</code> 是 <code>undefined</code> </li> 
    <li>文本节点的 <code>nodeValue</code> 是文本自身</li> 
    <li>属性节点的 <code>nodeValue</code> 是属性的值</li> 
   </ul> </li> 
  <li><p><code>nodeType</code></p></li> 
 </ul> 
 <p>元素为1,属性为2,文本为3,注释为8,文档为9。</p> 
 <ul> 
  <li>获取属性值 - <code>getAttribute()</code> ,也可以使用<code>.nodeValue</code> </li> 
 </ul> 
 <pre><code class="js">// 获取第一个 <title> 元素的 "lang" 属性的属性值
var val = xmlDoc.getElementsByTagName("title")[0].getAttribute("lang");
</code></pre> 
 <ul> 
  <li>修改属性值 - <code>setAttribute()</code> ,也可以使用<code>.nodeValue</code> </li> 
  <li>删除节点 - <code>removeChild()</code> </li> 
  <li>删除节点属性 - <code>removeAttribute(name)</code> </li> 
  <li>替换节点 - <code>replaceChild()</code> </li> 
  <li>创建节点 - <code>createElement()</code> 、<code>createAttribute()</code>、<code>createTextNode()</code>、<code>createComment()</code> </li> 
  <li>添加节点 - <code>appendChild()</code>、 <code>insertBefore(newNode,refNode)</code> </li> 
  <li>向文本节点添加文本 - <code>insertData(offset,string)</code> (从何处开始插入,要插入的字符串)</li> 
  <li>克隆节点 - <code>newNode=oldNode.cloneNode(true);</code> 参数代表是否克隆原节点的所有属性和子节点</li> 
 </ul> 
 <h5>6.5 定位节点</h5> 
 <p>与<code>DOM</code>一样,拥有一些定位关系节点的属性。<code>parentNode</code>、<code>childNodes</code>、<code>firstChild</code>、<code>lastChild</code>、<code>nextSibling</code>、<code>previousSibling</code></p> 
 <h4>七、 <code>XML</code>高级</h4> 
 <h5>7.1 命名空间</h5> 
 <p>在 <code>XML</code> 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。</p> 
 <ul> 
  <li>使用前缀</li> 
 </ul> 
 <pre><code class="xml"><f:table>
   <f:name>African Coffee Table</f:name>
   <f:width>80</f:width>
   <f:length>120</f:length>
</f:table>
</code></pre> 
 <ul> 
  <li>使用命名空间(<code>Namespaces</code>) : <code>xmlns:namespace-prefix="namespaceURI"</code> </li> 
 </ul> 
 <pre><code>
```xml
<h:table xmlns:h="http://www.w3.org/TR/html4/">
   <h:tr>
   <h:td>Apples</h:td>
   <h:td>Bananas</h:td>
   </h:tr>
</h:table>
</code></pre> 
 <ul> 
  <li>默认的命名空间(<code>Default Namespaces</code>)</li> 
 </ul> 
 <p>为元素定义默认的命名空间可以让我们<strong>省去在所有的子元素中使用前缀的工作。</strong></p> 
 <pre><code class="xml"><table xmlns="http://www.w3.org/TR/html4/">
   <tr>
   <td>Apples</td>
   <td>Bananas</td>
   </tr>
</table>
</code></pre> 
 <p>当开始使用 <code>XSL</code> 时,就会看到实际使用中的命名空间。<code>XSL</code> 样式表用于将<code>XML</code>文档转换为其他格式,会根据命名空间来对该命名空间的<code>xml</code>进行转换</p> 
 <pre><code class="js"><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/TR/html4/">
</code></pre> 
 <h5>7.2 CDATA</h5> 
 <p>所有 <code>XML</code>文档中的文本均会被解析器解析。只有 <code>CDATA</code> 区段(<code>CDATA section</code>)中的文本会被解析器忽略。<code>PCDATA</code> 指的是被解析的字符数据(<code>Parsed Character Data</code>), 术语 <code>CDATA</code> 指的是不应由 XML 解析器进行解析的文本数据(<code>Unparsed Character Data</code>)</p> 
 <p>在 <code>XML</code> 元素中,<code>"<"</code>和 <code>"&"</code>是非法的。</p> 
 <ul> 
  <li> <code>"<"</code> 会产生错误,因为解析器会把该字符解释为新元素的开始。</li> 
  <li> <code>"&"</code> 也会产生错误,因为解析器会把该字符解释为字符实体的开始。</li> 
 </ul> 
 <p>但是有些文本,比如<code>JavaScript</code>代码,会包含的大量的这样的字符,为避免错误,可以讲脚本代码定义为<code>CDATA</code>来让浏览器来忽略解析。</p> 
 <p><code>CDATA</code> 部分由 <code>"<![CDATA["</code> 开始,由 <code>"]]>"</code> 结束:</p> 
 <pre><code class="xml"><script>
<![CDATA[
function matchwo(a,b){
    if (a < b && a < 0) return 1;
    return 0;
}
]]>
</script>
</code></pre> 
 <p><code>CDATA</code> 部分不能包含字符串 <code>"]]>"</code>。也不允许嵌套的 <code>CDATA</code> 部分,标记 <code>CDATA</code> 部分结尾的 <code>"]]>"</code>不能包含空格或折行。</p> 
 <p>关于数据存储可看w3school - 把数据存储到 XML 文件</p> 
 <h4>八、 <code>XML DOM</code>补充</h4> 
 <h5>8.1 关于创建 XML DOM</h5> 
 <ul> 
  <li><code>document.implementation.createDocument(namespaceUri, root, doctype);</code></li> 
 </ul> 
 <p>在通过<code>JavaScript</code> 处理<code>XML</code>时,通常只使用参数<code>root</code>,因为这个参数指定的是<code>XML DOM</code> 文档元素的标签名。而<code>namespaceUri</code> 参数则很少用到,原因是在<code>JavaScrip</code> 中管理命名空间比较困难。最后,<code>doctype</code>(文档类型) 参数用得就更少。</p> 
 <pre><code class="js">var xmldom = document.implementation.createDocument('', "root", null);
</code></pre> 
 <h5>8.2 关于解析和序列化</h5> 
 <ul> 
  <li> <code>DOMParser</code>类型:将<code>XML</code>解析为<code>DOM</code> </li> 
 </ul> 
 <p>在解析<code>XML</code>之前,首先必须创建一个<code>DOMParser</code> 的实例,然后再调用<code>parseFromString()</code>方法。这个方法接受两个参数:要解析的<code>XML</code>字符串和内容类型(内容类型始终都应该是<code>"text/xml"</code>)</p> 
 <pre><code class="js">var parser = new DOMParser();
var xmldom = parser.parseFromString("<root><child/></root>", "text/xml");
</code></pre> 
 <p>在发生解析错误时, 仍然会从<code>parseFromString()</code>中返回一个<code>Document</code> 对象, 但这个对象的文档元素是<code><parsererror></code>。通过<code>getElementsByTagName()</code>来查找文档中是否存在<code><parsererror></code>元素以判断是否解析错误。</p> 
 <pre><code class="js">try {
    xmldom = parser.parseFromString("<root>", "text/xml");
    errors = xmldom.getElementsByTagName("parsererror");
    if (errors.length > 0){
        throw new Error("Parsing error!");
    }
} catch (ex) {
    alert("Parsing error!");
}
</code></pre> 
 <ul> 
  <li> <code>XMLSerializer</code>类型:将<code>DOM</code>文档序列化为<code>XML</code>字符串。</li> 
 </ul> 
 <pre><code class="js">var serializer = new XMLSerializer();
var xml = serializer.serializeToString(xmldom);
alert(xml);
</code></pre> 
 <p><code>XMLSerializer</code> 可以序列化任何有效的<code>DOM</code> 对象,不仅包括个别的节点,也包括<code>HTML</code> 文档。将<code>HTML</code> 文档传入<code>serializeToString()</code>以后,<code>HTML</code> 文档将被视为<code>XML</code> 文档,因此得到的代码也将是格式良好的。如果将非<code>DOM</code> 对象传入<code>serializeToString()</code>,会导致错误发生。</p> 
 <h5>8.3 关于IE8及之前版本的XML DOM创建 及解析与序列化</h5> 
 <ul> 
  <li>8.3.1 创建<code>XML DOM</code> </li> 
 </ul> 
 <pre><code class="js">xmlDoc=new ActiveXObject("Microsoft.XMLDOM");
</code></pre> 
 <ul> 
  <li>8.3.2 将<code>XML</code>解析为<code>DOM</code> </li> 
 </ul> 
 <pre><code class="js">xmlDoc.async="false";
xmlDoc.load("note.xml");
xmldom.loadXML("<root><child/></root>"); // 将xml字符串解析为dom
</code></pre> 
 <p>如果解析过程中出错,可以在<code>parseError</code> 属性中找到错误消息。</p> 
 <ul> 
  <li> <code>errorCode</code>:错误类型的数值编码;在没有发生错误时值为0。</li> 
  <li> <code>filePos</code>:文件中导致错误发生的位置。</li> 
  <li> <code>line</code>:发生错误的行。</li> 
  <li> <code>linepos</code>:发生错误的行中的字符。</li> 
  <li> <code>reason</code>:对错误的文本解释。</li> 
  <li> <code>srcText</code>:导致错误的代码。</li> 
  <li> <code>url</code>:导致错误的文件的<code>URL</code>(如果有这个文件的话)。</li> 
 </ul> 
 <p>另外,<code>parseError</code> 的<code>valueOf()</code>方法直接返回<code>errorCode</code> 的值,因此可以通过下列代码检测是否发生了解析错误。</p> 
 <pre><code class="js">if (xmldom.parseError != 0){
    alert("Parsing error occurred.");
}
</code></pre> 
 <ul> 
  <li>8.3.3 将<code>DOM</code>文档序列化为<code>XML</code>字符串。</li> 
 </ul> 
 <p><code>IE</code> 将序列化<code>XML</code> 的能力内置在了<code>DOM</code>文档中。每个<code>DOM</code>节点都有一个<code>xml</code> 属性,其中保存着表示该节点的<code>XML</code>字符串。</p> 
 <pre><code class="js">alert(xmldom.xml);
</code></pre> 
 <h4>九、 <code>XPath</code> 补充</h4> 
 <h5>9.1 XPathEvaluator类型</h5> 
 <p>用于在特定的上下文中对<code>XPath</code>表达式求值。</p> 
 <ul> 
  <li> <code>createExpression(expression, nsresolver)</code>:将<code>XPath</code> 表达式及相应的命名空间信息转换成一个<code>XPathExpression</code>,这是查询的编译版。在多次使用同一个查询时很有用。</li> 
  <li> <code>createNSResolver(node)</code>:根据<code>node</code>的命名空间信息创建一个新的<code>XPathNSResolver</code> 对象。在基于使用命名空间的<code>XML</code>文档求值时,需要使用<code>XPathNSResolver</code> 对象。</li> 
  <li> <code>evaluate(expression, context, nsresolver, type, result)</code>:在给定的上下文中,基于特定的命名空间信息来对<code>XPath</code>表达式求值。剩下的参数指定如何返回结果。</li> 
 </ul> 
 <p><code>evaluate()</code>是最常用的。这个方法接收<code>5</code> 个参数:<code>XPath</code>表达式、上下文节点、命名空间求解器、返回结果的类型和保存结果的<code>XPathResult</code>对象。</p> 
 <p>第三个参数只在<code>XML</code>代码中使用了<code>XML</code>命名空间时有必要指定,否则为<code>null</code>;第五个参数基本为null,因为结果会以函数值的形式返回,第四个参数是下列常量之一。</p> 
 <ul> 
  <li> <code>XPathResult.ANY_TYPE</code>:返回与<code>XPath</code> 表达式匹配的数据类型。</li> 
  <li> <code>XPathResult.NUMBER_TYPE</code>:返回数值。</li> 
  <li> <code>XPathResult.STRING_TYPE</code>:返回字符串值。</li> 
  <li> <code>XPathResult.BOOLEAN_TYPE</code>:返回布尔值。</li> 
  <li> <code>XPathResult.UNORDERED_NODE_ITERATOR_TYPE</code>:返回匹配的节点集合,次序不一定与文档一致。</li> 
  <li> <code>XPathResult.ORDERED_NODE_ITERATOR_TYPE</code>:返回匹配的节点集合,次序与文档一致。最常用。</li> 
  <li> <code>XPathResult.UNORDERED_NODE_SNAPSHOT_TYPE</code>:返回节点集合的快照,后续操作不会影响到这个节点集合。次序不一定一致。</li> 
  <li> <code>XPathResult.ORDERED_NODE_SNAPSHOT_TYPE</code>:返回节点集合的快照,后续操作不会影响到这个节点集合。次序一致。</li> 
  <li> <code>XPathResult.ANY_UNORDERED_NODE_TYPE</code>:返回匹配的节点集合,次序不一定与文档中的一致。</li> 
  <li> <code>XPathResult.FIRST_ORDERED_NODE_TYPE</code>:返回节点集合,只文档中第一个匹配的节点。</li> 
 </ul> 
 <pre><code class="js">var result = xmldom.evaluate("bookstore/book", xmldom.documentElement, null,
XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);

if (result !== null) {
    var node = result.iterateNext(); // 使用iterateNext()遍历dom节点集合
    while(node) {
        alert(node.tagName);
        node = node.iterateNext();
    }
}
</code></pre> 
 <p>如果指定的是快照结果类型(不管是次序一致还是次序不一致的),就必须使用<code>snapshotItem()</code>方法和<code>snapshotLength</code> 属性。</p> 
 <pre><code class="js">var result = xmldom.evaluate("employee/name", xmldom.documentElement, null,
XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);

if (result !== null) {
    for (var i=0, len=result.snapshotLength; i < len; i++) {
        alert(result.snapshotItem(i).tagName);
    }
}
</code></pre> 
 <ul> 
  <li>对于布尔值类型,如果至少有一个节点与<code>XPath</code> 表达式匹配,则求值结果返回<code>true</code>,否则返回<code>false</code>。<code>result.booleanValue</code> </li> 
  <li>对于数值类型,必须在<code>XPath</code> 表达式参数的位置上指定一个能够返回数值的<code>XPath</code>函数,例如计算与给定模式匹配的所有节点数量的<code>count()</code> ; <code>"count(employee/name)"</code> <code>result.numberValue</code>;没有指定类似的<code>XPath</code> 函数,那么<code>numberValue</code>的值将等于<code>NaN</code>。</li> 
  <li>对于字符串类型,<code>evaluate()</code>方法会查找与<code>XPath</code> 表达式匹配的第一个节点,然后返回其第一个子节点的值(实际上是假设第一个子节点为文本节点)。如果没有匹配的节点,结果就是一个空字符串。<code>result.stringValue</code> </li> 
 </ul> 
 <p>要确定返回的是什么结果类型,可以检测结果的<code>resultType</code>属性。</p> 
 <ul> 
  <li>对命名空间的支持</li> 
 </ul> 
 <p>通过<code>createNSResolver()</code>来创建<code>XPathNSResolver</code> 对象。这个方法接受一个参数,即文档中包含命名空间定义的节点。在<code>evaluate()</code>中使用返回的结果。</p> 
 <pre><code class="js">var nsresolver = xmldom.createNSResolver(xmldom.documentElement);
var result = xmldom.evaluate("wrox:book/wrox:author",
                    xmldom.documentElement, nsresolver,
                    XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
alert(result.snapshotLength);
</code></pre> 
 <p>第二种方式是定义一个函数,让它接收一个命名空间前缀,返回关联的URI,然后将这个函数的返回值传给<code>evaluate()</code>函数</p> 
 <pre><code class="js">var nsresolver = function(prefix){
    switch(prefix){
        case "wrox": return "http://www.wrox.com/";
      //其他前缀
    }
};
</code></pre> 
 <h5>9.2 IE中的XPath</h5> 
 <ul> 
  <li> <code>selectSingleNode()</code> 和<code>selectNodes()</code> </li> 
 </ul> 
 <p><code>selectSingleNode()</code>方法接受一个<code>XPath</code> 模式,在找到匹配节点时返回第一个匹配的节点,如果没有找到匹配的节点就返回<code>null</code>。</p> 
 <p><code>selectNodes()</code>也接收一个<code>XPath</code> 模式作为参数,但它返回与模式匹配的所有节点的<code>NodeList</code>(如果没有匹配的节点,则返回一个包含零项的<code>NodeList</code>)</p> 
 <pre><code class="js">var element = xmldom.documentElement.selectSingleNode("employee/name");
var elements = xmldom.documentElement.selectNodes("employee/name");
</code></pre> 
 <ul> 
  <li>IE对命名空间的支持</li> 
 </ul> 
 <p>要在<code>IE</code> 中处理包含命名空间的<code>XPath</code>表达式,你必须知道自己使用的命名空间,并按照格式创建一个字符串。</p> 
 <p><code>setProperty()</code>接收两个参数:要设置的属性名和属性值。在这里,属性名应是<code>"SelectionNamespaces"</code>,属性值就是按照前面格式创建的字符串。</p> 
 <p>字符串格式:<code>"xmlns:prefix1='uri1' xmlns:prefix2='uri2'</code></p> 
 <pre><code class="js">xmldom.setProperty("SelectionNamespaces", "xmlns:wrox=’http://www.wrox.com/’");
var result = xmldom.documentElement.selectNodes("wrox:book/wrox:author");
alert(result.length);
</code></pre> 
 <h4>十、 <code>XSLT</code> 补充</h4> 
 <h5>10.1 IE中的XLST转换</h5> 
 <p>使用<code>XSLT</code> 样式表转换<code>XML</code>文档的最简单方式,就是将它们<strong>分别加到一个<code>DOM</code>文档</strong>中,然后再使用<code>transformNode()</code>方法。这个方法存在于文档的所有节点中,它接受一个参数,即包含<code>XSLT</code>样式表的文档。调用<code>transformNode()</code>方法会返回一个包含转换信息的字符串。</p> 
 <pre><code class="js">//加载XML 和XSLT(仅限于IE)
xmldom.load("employees.xml");
xsltdom.load("employees.xslt");
//转换
var result = xmldom.transformNode(xsltdom);
</code></pre> 
 <p>还有使用这种语言的更复杂的方式。为此,必须要使用<code>XSL 模板</code>和<code>XSL 处理器</code>。第一步是要把<code>XSLT</code> 样式表加载到一个线程安全的<code>XML</code>文档中</p> 
 <pre><code class="js">//  线程安全的`XML`文档 尽量使用最新的版本
var xsltdom = new ActiveXObject("MSXML2.FreeThreadedDOMDocument.6.0");
//  XSL模板 尽量使用最新的版本  这个模板是用来创建XSL 处理器对象
var template = new ActiveXObject("MSXML2.XSLTemplate.6.0");
template.stylesheet = xsltdom;
var processor = template.createProcessor(); // 创建处理器
processor.input = xmldom;
processor.transform();
var result = processor.output;
</code></pre> 
 <p>在创建了<code>XSL</code> 处理器之后,必须将要转换的节点指定给<code>input</code> 属性。这个值可以是一个文档,也可以是文档中的任何节点。然后,调用<code>transform()</code>方法即可执行转换并将结果作为字符串保存在<code>output</code>属性中。这些代码实现了与<code>transformNode()</code>相同的功能。</p> 
 <p>使用<code>XSL</code> 处理器可以对转换进行更多的控制,同时也支持更高级的<code>XSLT</code> 特性。例如,<code>XSLT</code>样式表可以接受传入的参数,并将其用作局部变量。</p> 
 <pre><code class="html"><p>Message: <xsl:value-of select="$message"/></p>
</code></pre> 
 <p>定义了一个名为<code>message</code>的参数,然后将该参数输出到转换结果中。要设置<code>message</code>的值,可以在调用<code>transform()</code>之前使用<code>addParameter()</code>方法。</p> 
 <pre><code class="js">processor.input = xmldom.documentElement;
processor.addParameter("message", "Hello World!");
processor.transform();
</code></pre> 
 <p><code>XSL</code>处理器的另一个高级特性,就是能够设置一种操作模式。在<code>XSLT</code>中,可以使用<code>mode</code>特性为模板定义一种模式。在定义了模式后,如果没有将<code><xsl:apply-templates></code>与匹配的<code>mode</code>特性一起使用,就不会运行该模板。</p> 
 <pre><code class="html"><xsl:template match="employee" mode="title-first">
    <li><em><xsl:value-of select="@title"/></em>,
     <xsl:value-of select="name"/></li>
</xsl:template>
</code></pre> 
 <p>这个样式表定义了一个模板,并将其<code>mode</code>特性设置为<code>"title-first"</code>(即<code>“先显示title”</code>)为了使用这个模板,必须要用<code>JS</code>的方式用<code>setStartMode()</code>方法将<code><xsl:apply-templates></code>元素的模式设置为<code>"title-first"</code>。</p> 
 <pre><code class="js">processor.input = xmldom;
processor.addParameter("message", "Hello World!");
processor.setStartMode("title-first");// 必须在调用transform()之前进行。
processor.transform();
</code></pre> 
 <h5>10.2 常规浏览器中的XLST转换</h5> 
 <p>第一步也是加载两个<code>DOM</code> 文档,一个基于<code>XML</code>,另一个基于<code>XSLT</code>。然后,创建一个新<code>XSLTProcessor</code>对象,并使用<code>importStylesheet()</code>方法为其指定一个<code>XSLT</code>。最后一步就是执行转换。这一步有两种不同的方式,如果想返回一个完整的<code>DOM</code>文档,可以调用<code>transformToDocument()</code>。而通过调用<code>transformToFragment()</code>则可以得到一个文档片段对象。一般来说,使用<code>transformToFragment()</code>的唯一理由,就是你还想把返回的结果添加到另一个<code>DOM</code>文档中。</p> 
 <pre><code class="js">var processor = new XSLTProcessor()
processor.importStylesheet(xsltdom);
processor.setParameter(null, "message", "Hello World! "); // 也可以在转换前设置参数

// 常用转换
var result = processor.transformToDocument(xmldom);
alert(serializeXml(result));

// 用`transformToFragment()`把返回的结果添加到另一个`DOM`文档中。
var fragment = processor.transformToDocument(xmldom, document);
var div = document.getElementById("divResult");
div.appendChild(fragment);
</code></pre> 
 <p>还有两个与参数有关的方法,<code>getParameter()</code>和<code>removeParameter()</code>,分别用于取得和移除当前参数的值。这两个方法都要接受命名空间参数(同样,通常是<code>null</code>)和参数的内部名称。</p> 
 <pre><code class="js">alert(processor.getParameter(null, "message")); //输出"Hello World!"
processor.removeParameter(null, "message");
</code></pre> 
 <p><strong>每个<code>XSLTProcessor</code> 的实例都可以重用</strong>,以便使用不同的<code>XSLT</code> 样式表执行不同的转换。重置处理器时要调用<code>reset()</code>方法,这个方法会从处理器中移除所有参数和样式表。然后,你就可以再次调用<code>importStylesheet()</code>,以加载不同的XSLT 样式表。</p> 
 <pre><code class="js">var processor = new XSLTProcessor()
processor.importStylesheet(xsltdom);
//执行转换 do something
processor.reset();
processor.importStylesheet(xsltdom2);
//再执行转换
</code></pre> 
 <h5>10.3 跨浏览器使用XLST</h5> 
 <p>跨浏览器兼容性最好的<code>XSLT</code>转换技术,只能是返回结果字符串,为此在<code>IE</code> 中只能在上下文节点上调用<code>transformNode()</code>而不是处理器对象的<code>transform()</code>。</p> 
 <pre><code class="js">function transform(context, xslt){ // 接收两个参数:要执行转换的上下文节点和XSLT 文档对象
    if (typeof XSLTProcessor != "undefined"){ // 常规
        var processor = new XSLTProcessor();
        processor.importStylesheet(xslt);
        var result = processor.transformToDocument(context);
        return (new XMLSerializer()).serializeToString(result);
    } else if (typeof context.transformNode != "undefined") { // IE
        return context.transformNode(xslt);
    } else {
        throw new Error("No XSLT processor available.");
    }
}
</code></pre> 
</article>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1736757254922756096"></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">你可能感兴趣的:(JS高程:读书摘要(十六)XML)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1835512920797179904.htm"
                           title="element实现动态路由+面包屑" target="_blank">element实现动态路由+面包屑</a>
                        <span class="text-muted">软件技术NINI</span>
<a class="tag" taget="_blank" href="/search/vue%E6%A1%88%E4%BE%8B/1.htm">vue案例</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a>
                        <div>el-breadcrumb是ElementUI组件库中的一个面包屑导航组件,它用于显示当前页面的路径,帮助用户快速理解和导航到应用的各个部分。在Vue.js项目中,如果你已经安装了ElementUI,就可以很方便地使用el-breadcrumb组件。以下是一个基本的使用示例:安装ElementUI(如果你还没有安装的话):你可以通过npm或yarn来安装ElementUI。bash复制代码npmi</div>
                    </li>
                    <li><a href="/article/1835508131489214464.htm"
                           title="高级编程--XML+socket练习题" target="_blank">高级编程--XML+socket练习题</a>
                        <span class="text-muted">masa010</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>1.北京华北2114.8万人上海华东2,500万人广州华南1292.68万人成都华西1417万人(1)使用dom4j将信息存入xml中(2)读取信息,并打印控制台(3)添加一个city节点与子节点(4)使用socketTCP协议编写服务端与客户端,客户端输入城市ID,服务器响应相应城市信息(5)使用socketTCP协议编写服务端与客户端,客户端要求用户输入city对象,服务端接收并使用dom4j</div>
                    </li>
                    <li><a href="/article/1835506236842405888.htm"
                           title="C#中使用split分割字符串" target="_blank">C#中使用split分割字符串</a>
                        <span class="text-muted">互联网打工人no1</span>
<a class="tag" taget="_blank" href="/search/c%23/1.htm">c#</a>
                        <div>1、用字符串分隔:usingSystem.Text.RegularExpressions;stringstr="aaajsbbbjsccc";string[]sArray=Regex.Split(str,"js",RegexOptions.IgnoreCase);foreach(stringiinsArray)Response.Write(i.ToString()+"");输出结果:aaabbbc</div>
                    </li>
                    <li><a href="/article/1835504217729626112.htm"
                           title="Python教程:一文了解使用Python处理XPath" target="_blank">Python教程:一文了解使用Python处理XPath</a>
                        <span class="text-muted">旦莫</span>
<a class="tag" taget="_blank" href="/search/Python%E8%BF%9B%E9%98%B6/1.htm">Python进阶</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>目录1.环境准备1.1安装lxml1.2验证安装2.XPath基础2.1什么是XPath?2.2XPath语法2.3示例XML文档3.使用lxml解析XML3.1解析XML文档3.2查看解析结果4.XPath查询4.1基本路径查询4.2使用属性查询4.3查询多个节点5.XPath的高级用法5.1使用逻辑运算符5.2使用函数6.实战案例6.1从网页抓取数据6.1.1安装Requests库6.1.2代</div>
                    </li>
                    <li><a href="/article/1835498547785592832.htm"
                           title="【华为OD机试真题2023B卷 JAVA&JS】We Are A Team" target="_blank">【华为OD机试真题2023B卷 JAVA&JS】We Are A Team</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/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%8D%8E%E4%B8%BA/1.htm">华为</a><a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a>
                        <div>华为OD2023(B卷)机试题库全覆盖,刷题指南点这里WeAreATeam时间限制:1秒|内存限制:32768K|语言限制:不限题目描述:总共有n个人在机房,每个人有一个标号(1<=标号<=n),他们分成了多个团队,需要你根据收到的m条消息判定指定的两个人是否在一个团队中,具体的:1、消息构成为:abc,整数a、b分别代</div>
                    </li>
                    <li><a href="/article/1835497074049773568.htm"
                           title="数组去重" target="_blank">数组去重</a>
                        <span class="text-muted">好奇的猫猫猫</span>

                        <div>整理自js中基础数据结构数组去重问题思考?如何去除数组中重复的项例如数组:[1,3,4,3,5]我们在做去重的时候,一开始想到的肯定是,逐个比较,外面一层循环,内层后一个与前一个一比较,如果是久不将当前这一项放进新的数组,挨个比较完之后返回一个新的去过重复的数组不好的实践方式上述方法效率极低,代码量还多,思考?有没有更好的方法这时候不禁一想当然有了!!!hashtable啊,通过对象的hash办法</div>
                    </li>
                    <li><a href="/article/1835495551186071552.htm"
                           title="读书||陶新华《教育中的积极心理学》1—28" target="_blank">读书||陶新华《教育中的积极心理学》1—28</a>
                        <span class="text-muted">流水淙淙2022</span>

                        <div>读一本好书,尤如和一位高尚者对话,亦能对人的精神进行洗礼。但是若不能和实践结合起来,也只能落到空读书的状态。读书摘要与感想1、塞利格曼在《持续的幸福》一书中提出了幸福2.0理论,提出幸福由5个元素决定——积极情绪、投入的工作和生活、目标和意义、和谐的人际关系、成就感。2、人的大脑皮层在进行智力活动时,都伴有皮下中枢活动,对这些活动进行体验请假,并由此产生了情感解读。人的情绪情感体验总是优先于大脑的</div>
                    </li>
                    <li><a href="/article/1835494762388484096.htm"
                           title="【目标检测数据集】卡车数据集1073张VOC+YOLO格式" target="_blank">【目标检测数据集】卡车数据集1073张VOC+YOLO格式</a>
                        <span class="text-muted">熬夜写代码的平头哥∰</span>
<a class="tag" taget="_blank" href="/search/%E7%9B%AE%E6%A0%87%E6%A3%80%E6%B5%8B/1.htm">目标检测</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a>
                        <div>数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):1073标注数量(xml文件个数):1073标注数量(txt文件个数):1073标注类别数:1标注类别名称:["truck"]每个类别标注的框数:truck框数=1120总框数:1120使用标注工具:labelImg标注</div>
                    </li>
                    <li><a href="/article/1835494258262503424.htm"
                           title="【JS】执行时长(100分) |思路参考+代码解析(C++)" target="_blank">【JS】执行时长(100分) |思路参考+代码解析(C++)</a>
                        <span class="text-muted">l939035548</span>
<a class="tag" taget="_blank" href="/search/JS/1.htm">JS</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a>
                        <div>题目为了充分发挥GPU算力,需要尽可能多的将任务交给GPU执行,现在有一个任务数组,数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。假设GPU最多一次执行n个任务,一次执行耗时1秒,在保证GPU不空闲情况下,最少需要多长时间执行完成。题目输入第一个参数为GPU一次最多执行的任务个数,取值范围[1,10000]第二个参数为任务数组长度,取值范围[1,10000]第三个参数为任务数组,数字范围</div>
                    </li>
                    <li><a href="/article/1835492740536823808.htm"
                           title="node.js学习" target="_blank">node.js学习</a>
                        <span class="text-muted">小猿L</span>
<a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/node.js/1.htm">node.js</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/vim/1.htm">vim</a>
                        <div>node.js学习实操及笔记温故node.js,node.js学习实操过程及笔记~node.js学习视频node.js官网node.js中文网实操笔记githubcsdn笔记为什么学node.js可以让别人访问我们编写的网页为后续的框架学习打下基础,三大框架vuereactangular离不开node.jsnode.js是什么官网:node.js是一个开源的、跨平台的运行JavaScript的运行</div>
                    </li>
                    <li><a href="/article/1835492742713667584.htm"
                           title="钢筋长度超限检测检数据集VOC+YOLO格式215张1类别" target="_blank">钢筋长度超限检测检数据集VOC+YOLO格式215张1类别</a>
                        <span class="text-muted">futureflsl</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E9%9B%86/1.htm">数据集</a><a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0/1.htm">深度学习</a><a class="tag" taget="_blank" href="/search/%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0/1.htm">机器学习</a>
                        <div>数据集格式:PascalVOC格式+YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件)图片数量(jpg文件个数):215标注数量(xml文件个数):215标注数量(txt文件个数):215标注类别数:1标注类别名称:["iron"]每个类别标注的框数:iron框数=215总框数:215使用标注工具:labelImg标注规则:对类别进</div>
                    </li>
                    <li><a href="/article/1835491350896799744.htm"
                           title="赠晶晶" target="_blank">赠晶晶</a>
                        <span class="text-muted">在平凡中重新出发</span>

                        <div>逐伊衫望伊泪伊人雨中别离去莫再想莫再追莫要寸断再回味十六年六十年弹指挥间青鬓颜且浅行且珍惜待到山花烂漫时图片发自App</div>
                    </li>
                    <li><a href="/article/1835485429059645440.htm"
                           title="docker" target="_blank">docker</a>
                        <span class="text-muted">igotyback</span>
<a class="tag" taget="_blank" href="/search/eureka/1.htm">eureka</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E5%8E%9F%E7%94%9F/1.htm">云原生</a>
                        <div>Docker容器的文件系统是隔离的,但是可以通过挂载卷(Volumes)或绑定挂载(BindMounts)将宿主机的文件系统目录映射到容器内部。要查看Docker容器的映射路径,可以使用以下方法:查看容器配置:使用dockerinspect命令可以查看容器的详细配置信息,包括挂载的卷。例如:bashdockerinspect在输出的JSON格式中,查找"Mounts"部分,这里会列出所有的挂载信息</div>
                    </li>
                    <li><a href="/article/1835480639814594560.htm"
                           title="在Ubuntu中编译含有JSON的文件出现报错" target="_blank">在Ubuntu中编译含有JSON的文件出现报错</a>
                        <span class="text-muted">芝麻糊76</span>
<a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/kill_bug/1.htm">kill_bug</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/json/1.htm">json</a>
                        <div>在ubuntu中进行JSON相关学习的时候,我发现了一些小问题,决定与大家进行分享,减少踩坑时候出现不必要的时间耗费截取部分含有JSON部分的代码进行展示char*str="{\"title\":\"JSONExample\",\"author\":{\"name\":\"JohnDoe\",\"age\":35,\"isVerified\":true},\"tags\":[\"json\",\"</div>
                    </li>
                    <li><a href="/article/1835479758033481728.htm"
                           title="SpringBlade dict-biz/list 接口 SQL 注入漏洞" target="_blank">SpringBlade dict-biz/list 接口 SQL 注入漏洞</a>
                        <span class="text-muted">文章永久免费只为良心</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>SpringBladedict-biz/list接口SQL注入漏洞POC:构造请求包查看返回包你的网址/api/blade-system/dict-biz/list?updatexml(1,concat(0x7e,md5(1),0x7e),1)=1漏洞概述在SpringBlade框架中,如果dict-biz/list接口的后台处理逻辑没有正确地对用户输入进行过滤或参数化查询(PreparedSta</div>
                    </li>
                    <li><a href="/article/1835478496810463232.htm"
                           title="Xinference如何注册自定义模型" target="_blank">Xinference如何注册自定义模型</a>
                        <span class="text-muted">玩人工智能的辣条哥</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">大模型</a><a class="tag" taget="_blank" href="/search/Xinference/1.htm">Xinference</a>
                        <div>环境:Xinference问题描述:Xinference如何注册自定义模型解决方案:1.写个model_config.json,内容如下{"version":1,"context_length":2048,"model_name":"custom-llama-3","model_lang":["en","ch"],"model_ability":["generate","chat"],"model</div>
                    </li>
                    <li><a href="/article/1835461801232396288.htm"
                           title="现代汉语粗糙版 文学史与经典" target="_blank">现代汉语粗糙版 文学史与经典</a>
                        <span class="text-muted">学习搬运工</span>

                        <div>第十六章文学史与经典文学史的兴起在西方,虽然从亚里士多德开始,在人类的著述中已经可以找到文学史概念与写作方式的萌芽,但是,人们一般认为17世纪后期到18世纪是现代文学史写作真正开始的时期。长达百年波及整个欧洲的“古今之争”孕育出文学研究的历史意识,现代意义上的文学史观念在这场影响深远的论争中初见端倪。从18世纪晚期到19世纪初,由于席勒、弗·施莱格尔和赫尔德等人的介入,文学史研究逐渐变得复杂和成熟</div>
                    </li>
                    <li><a href="/article/1835458199755517952.htm"
                           title="spring如何整合druid连接池?" target="_blank">spring如何整合druid连接池?</a>
                        <span class="text-muted">惜.己</span>
<a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/junit/1.htm">junit</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/idea/1.htm">idea</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a><a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                        <div>目录spring整合druid连接池1.新建maven项目2.新建mavenModule3.导入相关依赖4.配置log4j2.xml5.配置druid.xml1)xml中如何引入properties2)下面是配置文件6.准备jdbc.propertiesJDBC配置项解释7.配置druid8.测试spring整合druid连接池1.新建maven项目打开IDE(比如IntelliJIDEA,Ecl</div>
                    </li>
                    <li><a href="/article/1835455048277127168.htm"
                           title="Python神器!WEB自动化测试集成工具 DrissionPage" target="_blank">Python神器!WEB自动化测试集成工具 DrissionPage</a>
                        <span class="text-muted">亚丁号</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>一、前言用requests做数据采集面对要登录的网站时,要分析数据包、JS源码,构造复杂的请求,往往还要应付验证码、JS混淆、签名参数等反爬手段,门槛较高。若数据是由JS计算生成的,还须重现计算过程,体验不好,开发效率不高。使用浏览器,可以很大程度上绕过这些坑,但浏览器运行效率不高。因此,这个库设计初衷,是将它们合而为一,能够在不同须要时切换相应模式,并提供一种人性化的使用方法,提高开发和运行效率</div>
                    </li>
                    <li><a href="/article/1835447985601867776.htm"
                           title="Mongodb Error: queryTxt ETIMEOUT xxxx.wwwdz.mongodb.net" target="_blank">Mongodb Error: queryTxt ETIMEOUT xxxx.wwwdz.mongodb.net</a>
                        <span class="text-muted">佛一脚</span>
<a class="tag" taget="_blank" href="/search/error/1.htm">error</a><a class="tag" taget="_blank" href="/search/react/1.htm">react</a><a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>背景每天都能遇到奇怪的问题,做个记录,以便有缘人能得到帮助!换了一台电脑开发nextjs程序。需要连接mongodb数据,对数据进行增删改查。上一台电脑好好的程序,新电脑死活连不上mongodb数据库。同一套代码,没任何修改,搞得我怀疑人生了,打开浏览器进入mongodb官网毫无问题,也能进入线上系统查看数据,网络应该是没问题。于是我尝试了一下手机热点,这次代码能正常跑起来,连接数据库了!!!是不</div>
                    </li>
                    <li><a href="/article/1835443822654484480.htm"
                           title="遥感影像的切片处理" target="_blank">遥感影像的切片处理</a>
                        <span class="text-muted">sand&wich</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89/1.htm">计算机视觉</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E5%83%8F%E5%A4%84%E7%90%86/1.htm">图像处理</a>
                        <div>在遥感影像分析中,经常需要将大尺寸的影像切分成小片段,以便于进行详细的分析和处理。这种方法特别适用于机器学习和图像处理任务,如对象检测、图像分类等。以下是如何使用Python和OpenCV库来实现这一过程,同时确保每个影像片段保留正确的地理信息。准备环境首先,确保安装了必要的Python库,包括numpy、opencv-python和xml.etree.ElementTree。这些库将用于图像处理</div>
                    </li>
                    <li><a href="/article/1835443569528238080.htm"
                           title="Vue( ElementUI入门、vue-cli安装)" target="_blank">Vue( ElementUI入门、vue-cli安装)</a>
                        <span class="text-muted">m0_l5z</span>
<a class="tag" taget="_blank" href="/search/elementui/1.htm">elementui</a><a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a>
                        <div>一.ElementUI入门目录:1.ElementUI入门1.1ElementUI简介1.2Vue+ElementUI安装1.3开发示例2.搭建nodejs环境2.1nodejs介绍2.2npm是什么2.3nodejs环境搭建2.3.1下载2.3.2解压2.3.3配置环境变量2.3.4配置npm全局模块路径和cache默认安装位置2.3.5修改npm镜像提高下载速度2.3.6验证安装结果3.运行n</div>
                    </li>
                    <li><a href="/article/1835443143407923200.htm"
                           title="华杉版资治通鉴【1837】崔祐甫糊弄皇帝。2023-02-20" target="_blank">华杉版资治通鉴【1837】崔祐甫糊弄皇帝。2023-02-20</a>
                        <span class="text-muted">华杉2009</span>

                        <div>7、常衮性格刚强急躁,为政苛刻琐碎,不合众心。当时,群臣早晚临丧哭哀,常衮哭得站不稳,随从有时就上前扶着他。中书舍人崔祐甫指给大家看,说:“臣子在国君灵柩前哭泣,有要人搀扶的礼节吗!”常衮听见,更加怀恨。会议讨论群臣丧服,常衮认为:“按礼制,臣为君穿丧服三年。汉文帝权衡缩短,仍然要穿三十六日。高宗以来,都遵循汉制。到了玄宗、肃宗之丧,开始只穿二十七日。如今先帝遗诏说:‘天下吏人,三日脱下丧服。’古</div>
                    </li>
                    <li><a href="/article/1835439069815992320.htm"
                           title="《结婚十六年感赋》" target="_blank">《结婚十六年感赋》</a>
                        <span class="text-muted">灵隐济癫</span>

                        <div>弹指光阴逝,成婚十六年。相亲酬旧约,作伴惜良缘。不羡鸳鸯侣,当如鸾凤仙。齐眉情缱绻,携手意缠绵。</div>
                    </li>
                    <li><a href="/article/1835437775344726016.htm"
                           title="博客网站制作教程" target="_blank">博客网站制作教程</a>
                        <span class="text-muted">2401_85194651</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/maven/1.htm">maven</a>
                        <div>首先就是技术框架:后端:Java+SpringBoot数据库:MySQL前端:Vue.js数据库连接:JPA(JavaPersistenceAPI)1.项目结构blog-app/├──backend/│├──src/main/java/com/example/blogapp/││├──BlogApplication.java││├──config/│││└──DatabaseConfig.java</div>
                    </li>
                    <li><a href="/article/1835435506645692416.htm"
                           title="00. 这里整理了最全的爬虫框架(Java + Python)" target="_blank">00. 这里整理了最全的爬虫框架(Java + Python)</a>
                        <span class="text-muted">有一只柴犬</span>
<a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB%E7%B3%BB%E5%88%97/1.htm">爬虫系列</a><a class="tag" taget="_blank" href="/search/%E7%88%AC%E8%99%AB/1.htm">爬虫</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>目录1、前言2、什么是网络爬虫3、常见的爬虫框架3.1、java框架3.1.1、WebMagic3.1.2、Jsoup3.1.3、HttpClient3.1.4、Crawler4j3.1.5、HtmlUnit3.1.6、Selenium3.2、Python框架3.2.1、Scrapy3.2.2、BeautifulSoup+Requests3.2.3、Selenium3.2.4、PyQuery3.2</div>
                    </li>
                    <li><a href="/article/1835431726982197248.htm"
                           title="vue 创建项目报错:command failed: npm install --loglevel error" target="_blank">vue 创建项目报错:command failed: npm install --loglevel error</a>
                        <span class="text-muted">那鱼、会飞</span>
<a class="tag" taget="_blank" href="/search/vue.js/1.htm">vue.js</a><a class="tag" taget="_blank" href="/search/vue-cli3/1.htm">vue-cli3</a>
                        <div>这个问题其实很好解决,只是很多种情况,逐一排除即可。稳下心来~vuecli3创建项目我的node版本是node14.15.0,(永远不要尝试最新版本)node各种版本下载地址:以往的版本|Node.js(nodejs.org)vue/cli@3.12.1npminstall-g@vue/cli@3.12.1(注意vue/cli2和vue/cli3的下载命名有所改变,2是-形式,3是/形式)其实报错</div>
                    </li>
                    <li><a href="/article/1835430719363575808.htm"
                           title="更改npm镜像源为淘宝镜像" target="_blank">更改npm镜像源为淘宝镜像</a>
                        <span class="text-muted">骆小骆</span>
<a class="tag" taget="_blank" href="/search/%E5%9F%BA%E4%BA%8Enode.js/1.htm">基于node.js</a>
                        <div>npm常用指令后缀*最近复习了一下node.js整理了一下跟node.js相关的指令后缀*--save、-S参数意思是把模块的版本信息保存到dependencies(生产环境依赖)中,即你的package.json文件的dependencies字段中;–--save-dev、-D参数意思是把模块版本信息保存到devDependencies(开发环境依赖)中,即你的package.json文件的de</div>
                    </li>
                    <li><a href="/article/1835430340806668288.htm"
                           title="COCO 格式的数据集转化为 YOLO 格式的数据集" target="_blank">COCO 格式的数据集转化为 YOLO 格式的数据集</a>
                        <span class="text-muted">QYQY77</span>
<a class="tag" taget="_blank" href="/search/YOLO/1.htm">YOLO</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>"""--json_path输入的json文件路径--save_path保存的文件夹名字,默认为当前目录下的labels。"""importosimportjsonfromtqdmimporttqdmimportargparseparser=argparse.ArgumentParser()parser.add_argument('--json_path',default='./instances</div>
                    </li>
                    <li><a href="/article/1835424412342513664.htm"
                           title="ChatGPT 高效学习套路揭秘:让知识获取事半功倍的秘诀" target="_blank">ChatGPT 高效学习套路揭秘:让知识获取事半功倍的秘诀</a>
                        <span class="text-muted">kkai人工智能</span>
<a class="tag" taget="_blank" href="/search/chatgpt/1.htm">chatgpt</a><a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E5%AA%92%E4%BD%93/1.htm">媒体</a><a class="tag" taget="_blank" href="/search/ai/1.htm">ai</a>
                        <div>最近这段时间,AI热潮因ChatGPT的火爆再次掀起。如今,网上大部分内容都在调侃AI,但很少有人探讨如何正经使用ChatGPT做事情。作为一名靠搜索引擎和GitHub自学编程的开发者,第一次和ChatGPT深度交流后,我就确信:ChatGPT能够极大提高程序员学习新技术的效率。使用ChatGPT一个月后,我越发感受到它的颠覆性。因此,我想从工作和学习的角度,分享它的优势及我的一些使用技巧,而非娱</div>
                    </li>
                                <li><a href="/article/5.htm"
                                       title="[星球大战]阿纳金的背叛" target="_blank">[星球大战]阿纳金的背叛</a>
                                    <span class="text-muted">comsci</span>

                                    <div> 
      本来杰迪圣殿的长老是不同意让阿纳金接受训练的......... 
 
    但是由于政治原因,长老会妥协了...这给邪恶的力量带来了机会 
 
    所以......现代的地球联邦接受了这个教训...绝对不让某些年轻人进入学院 
 
   </div>
                                </li>
                                <li><a href="/article/132.htm"
                                       title="看懂它,你就可以任性的玩耍了!" target="_blank">看懂它,你就可以任性的玩耍了!</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/JavaScript/1.htm">JavaScript</a>
                                    <div>          javascript作为前端开发的标配技能,如果不掌握好它的三大特点:1.原型 2.作用域 3. 闭包 ,又怎么可以说你学好了这门语言呢?如果标配的技能都没有撑握好,怎么可以任性的玩耍呢?怎么验证自己学好了以上三个基本点呢,我找到一段不错的代码,稍加改动,如果能够读懂它,那么你就可以任性了。 
function jClass(b</div>
                                </li>
                                <li><a href="/article/259.htm"
                                       title="Java常用工具包 Jodd" target="_blank">Java常用工具包 Jodd</a>
                                    <span class="text-muted">Kai_Ge</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/jodd/1.htm">jodd</a>
                                    <div>Jodd 是一个开源的 Java 工具集, 包含一些实用的工具类和小型框架。简单,却很强大!  写道   Jodd = Tools + IoC + MVC + DB + AOP + TX + JSON + HTML < 1.5 Mb  
Jodd 被分成众多模块,按需选择,其中 
 
  工具类模块有:  
  
   jodd-core    &nb</div>
                                </li>
                                <li><a href="/article/386.htm"
                                       title="SpringMvc下载" target="_blank">SpringMvc下载</a>
                                    <span class="text-muted">120153216</span>
<a class="tag" taget="_blank" href="/search/springMVC/1.htm">springMVC</a>
                                    <div>@RequestMapping(value = WebUrlConstant.DOWNLOAD)
	public void download(HttpServletRequest request,HttpServletResponse response,String fileName) {
		OutputStream os = null;
		InputStream is = null;
</div>
                                </li>
                                <li><a href="/article/513.htm"
                                       title="Python 标准异常总结" target="_blank">Python 标准异常总结</a>
                                    <span class="text-muted">2002wmj</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                                    <div>Python标准异常总结  
    AssertionError 断言语句(assert)失败   AttributeError 尝试访问未知的对象属性   EOFError 用户输入文件末尾标志EOF(Ctrl+d)   FloatingPointError 浮点计算错误   GeneratorExit generator.close()方法被调用的时候   ImportError 导入模块失</div>
                                </li>
                                <li><a href="/article/640.htm"
                                       title="SQL函数返回临时表结构的数据用于查询" target="_blank">SQL函数返回临时表结构的数据用于查询</a>
                                    <span class="text-muted">357029540</span>
<a class="tag" taget="_blank" href="/search/SQL+Server/1.htm">SQL Server</a>
                                    <div>这两天在做一个查询的SQL,这个SQL的一个条件是通过游标实现另外两张表查询出一个多条数据,这些数据都是INT类型,然后用IN条件进行查询,并且查询这两张表需要通过外部传入参数才能查询出所需数据,于是想到了用SQL函数返回值,并且也这样做了,由于是返回多条数据,所以把查询出来的INT类型值都拼接为了字符串,这时就遇到问题了,在查询SQL中因为条件是INT值,SQL函数的CAST和CONVERST都</div>
                                </li>
                                <li><a href="/article/767.htm"
                                       title="java 时间格式化 | 比较大小| 时区 个人笔记" target="_blank">java 时间格式化 | 比较大小| 时区 个人笔记</a>
                                    <span class="text-muted">7454103</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/eclipse/1.htm">eclipse</a><a class="tag" taget="_blank" href="/search/tomcat/1.htm">tomcat</a><a class="tag" taget="_blank" href="/search/c/1.htm">c</a><a class="tag" taget="_blank" href="/search/MyEclipse/1.htm">MyEclipse</a>
                                    <div>个人总结! 不当之处多多包含! 
 
  引用   1.0 如何设置 tomcat 的时区: 
         位置:(catalina.bat---JAVA_OPTS  下面加上) 
         set JAVA_OPT</div>
                                </li>
                                <li><a href="/article/894.htm"
                                       title="时间获取Clander的用法" target="_blank">时间获取Clander的用法</a>
                                    <span class="text-muted">adminjun</span>
<a class="tag" taget="_blank" href="/search/Clander/1.htm">Clander</a><a class="tag" taget="_blank" href="/search/%E6%97%B6%E9%97%B4/1.htm">时间</a>
                                    <div>/** 
   * 得到几天前的时间 
   * @param d 
   * @param day 
   * @return 
   */ 
  public static Date getDateBefore(Date d,int day){ 
   Calend</div>
                                </li>
                                <li><a href="/article/1021.htm"
                                       title="JVM初探与设置" target="_blank">JVM初探与设置</a>
                                    <span class="text-muted">aijuans</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                                    <div>JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台</div>
                                </li>
                                <li><a href="/article/1148.htm"
                                       title="SQL中ON和WHERE的区别" target="_blank">SQL中ON和WHERE的区别</a>
                                    <span class="text-muted">avords</span>

                                    <div>SQL中ON和WHERE的区别       
数据库在通过连接两张或多张表来返回记录时,都会生成一张中间的临时表,然后再将这张临时表返回给用户。   www.2cto.com     在使用left jion时,on和where条件的区别如下:    1、 on条件是在生成临时表时使用的条件,它不管on中的条件是否为真,都会返回左边表中的记录。  </div>
                                </li>
                                <li><a href="/article/1275.htm"
                                       title="说说自信" target="_blank">说说自信</a>
                                    <span class="text-muted">houxinyou</span>
<a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a>
                                    <div>自信的来源分为两种,一种是源于实力,一种源于头脑.实力是一个综合的评定,有自身的能力,能利用的资源等.比如我想去月亮上,要身体素质过硬,还要有飞船等等一系列的东西.这些都属于实力的一部分.而头脑不同,只要你头脑够简单就可以了!同样要上月亮上,你想,我一跳,1米,我多跳几下,跳个几年,应该就到了!什么?你说我会往下掉?你笨呀你!找个东西踩一下不就行了吗? 
  
  
无论工作还</div>
                                </li>
                                <li><a href="/article/1402.htm"
                                       title="WEBLOGIC事务超时设置" target="_blank">WEBLOGIC事务超时设置</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/weblogic/1.htm">weblogic</a><a class="tag" taget="_blank" href="/search/jta/1.htm">jta</a><a class="tag" taget="_blank" href="/search/%E4%BA%8B%E5%8A%A1%E8%B6%85%E6%97%B6/1.htm">事务超时</a>
                                    <div>        系统中统计数据,由于调用统计过程,执行时间超过了weblogic设置的时间,提示如下错误: 
统计数据出错!
原因:The transaction is no longer active - status: 'Rolling Back. [Reason=weblogic.transaction.internal</div>
                                </li>
                                <li><a href="/article/1529.htm"
                                       title="两年已过去,再看该如何快速融入新团队" target="_blank">两年已过去,再看该如何快速融入新团队</a>
                                    <span class="text-muted">bingyingao</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a><a class="tag" taget="_blank" href="/search/%E8%9E%8D%E5%85%A5/1.htm">融入</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a><a class="tag" taget="_blank" href="/search/%E6%96%B0%E5%9B%A2%E9%98%9F/1.htm">新团队</a>
                                    <div>偶得的空闲,翻到了两年前的帖子 
该如何快速融入一个新团队,有所感触,就记下来,为下一个两年后的今天做参考。 
 
    时隔两年半之后的今天,再来看当初的这个博客,别有一番滋味。而我已经于今年三月份离开了当初所在的团队,加入另外的一个项目组,2011年的这篇博客之后的时光,我很好的融入了那个团队,而直到现在和同事们关系都特别好。大家在短短一年半的时间离一起经历了一</div>
                                </li>
                                <li><a href="/article/1656.htm"
                                       title="【Spark七十七】Spark分析Nginx和Apache的access.log" target="_blank">【Spark七十七】Spark分析Nginx和Apache的access.log</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/apache/1.htm">apache</a>
                                    <div>Spark分析Nginx和Apache的access.log,第一个问题是要对Nginx和Apache的access.log文件进行按行解析,按行解析就的方法是正则表达式: 
  
Nginx的access.log解析正则表达式 
  
val PATTERN = """([^ ]*) ([^ ]*) ([^ ]*) (\\[.*\\]) (\&q</div>
                                </li>
                                <li><a href="/article/1783.htm"
                                       title="Erlang patch" target="_blank">Erlang patch</a>
                                    <span class="text-muted">bookjovi</span>
<a class="tag" taget="_blank" href="/search/erlang/1.htm">erlang</a>
                                    <div>Totally five patchs committed to erlang otp, just small patchs. 
IMO, erlang really is a interesting programming language, I really like its concurrency feature. 
but the functional programming style </div>
                                </li>
                                <li><a href="/article/1910.htm"
                                       title="log4j日志路径中加入日期" target="_blank">log4j日志路径中加入日期</a>
                                    <span class="text-muted">bro_feng</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/log4j/1.htm">log4j</a>
                                    <div>要用log4j使用记录日志,日志路径有每日的日期,文件大小5M新增文件。 
实现方式 
log4j: 
<appender name="serviceLog"
		class="org.apache.log4j.RollingFileAppender">
      	<param name="Encoding" v</div>
                                </li>
                                <li><a href="/article/2037.htm"
                                       title="读《研磨设计模式》-代码笔记-桥接模式" target="_blank">读《研磨设计模式》-代码笔记-桥接模式</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a>
                                    <div>声明: 本文只为方便我个人查阅和理解,详细的分析以及源代码请移步 原作者的博客http://chjavach.iteye.com/ 
 
 



/**
 * 个人觉得关于桥接模式的例子,蜡笔和毛笔这个例子是最贴切的:http://www.cnblogs.com/zhenyulu/articles/67016.html
 * 笔和颜色是可分离的,蜡笔把两者耦合在一起了:一支蜡笔只有一种</div>
                                </li>
                                <li><a href="/article/2164.htm"
                                       title="windows7下SVN和Eclipse插件安装" target="_blank">windows7下SVN和Eclipse插件安装</a>
                                    <span class="text-muted">chenyu19891124</span>
<a class="tag" taget="_blank" href="/search/eclipse%E6%8F%92%E4%BB%B6/1.htm">eclipse插件</a>
                                    <div>今天花了一天时间弄SVN和Eclipse插件的安装,今天弄好了。svn插件和Eclipse整合有两种方式,一种是直接下载插件包,二种是通过Eclipse在线更新。由于之前Eclipse版本和svn插件版本有差别,始终是没装上。最后在网上找到了适合的版本。所用的环境系统:windows7JDK:1.7svn插件包版本:1.8.16Eclipse:3.7.2工具下载地址:Eclipse下在地址:htt</div>
                                </li>
                                <li><a href="/article/2291.htm"
                                       title="[转帖]工作流引擎设计思路" target="_blank">[转帖]工作流引擎设计思路</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F/1.htm">设计模式</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/workflow/1.htm">workflow</a><a class="tag" taget="_blank" href="/search/%E4%BC%81%E4%B8%9A%E5%BA%94%E7%94%A8/1.htm">企业应用</a>
                                    <div> 作为国内的同行,我非常希望在流程设计方面和大家交流,刚发现篇好文(那么好的文章,现在才发现,可惜),关于流程设计的一些原理,个人觉得本文站得高,看得远,比俺的文章有深度,转载如下 
 
================================================================================= 
 
自开博以来不断有朋友来探讨工作流引擎该如何</div>
                                </li>
                                <li><a href="/article/2418.htm"
                                       title="Linux 查看内存,CPU及硬盘大小的方法" target="_blank">Linux 查看内存,CPU及硬盘大小的方法</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/cpu/1.htm">cpu</a><a class="tag" taget="_blank" href="/search/%E5%86%85%E5%AD%98/1.htm">内存</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E7%9B%98/1.htm">硬盘</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E5%B0%8F/1.htm">大小</a>
                                    <div>一、查看CPU信息的命令 
 
[root@R4 ~]# cat /proc/cpuinfo |grep "model name" && cat /proc/cpuinfo |grep "physical id" 
model name : Intel(R) Xeon(R) CPU X5450 @ 3.00GHz 
model name : </div>
                                </li>
                                <li><a href="/article/2545.htm"
                                       title="linux 踢出在线用户" target="_blank">linux 踢出在线用户</a>
                                    <span class="text-muted">dongwei_6688</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                                    <div>两个步骤: 
1.用w命令找到要踢出的用户,比如下面: 
  
[root@localhost ~]# w
 18:16:55 up 39 days,  8:27,  3 users,  load average: 0.03, 0.03, 0.00
USER     TTY      FROM              LOGIN@   IDLE   JCPU   PCPU WHAT</div>
                                </li>
                                <li><a href="/article/2672.htm"
                                       title="放手吧,就像不曾拥有过一样" target="_blank">放手吧,就像不曾拥有过一样</a>
                                    <span class="text-muted">dcj3sjt126com</span>

                                    <div>内容提要:   
静悠悠编著的《放手吧就像不曾拥有过一样》集结“全球华语世界最舒缓心灵”的精华故事,触碰生命最深层次的感动,献给全世界亿万读者。《放手吧就像不曾拥有过一样》的作者衷心地祝愿每一位读者都给自己一个重新出发的理由,将那些令你痛苦的、扛起的、背负的,一并都放下吧!把憔悴的面容换做一种清淡的微笑,把沉重的步伐调节成春天五线谱上的音符,让自己踏着轻快的节奏,在人生的海面上悠然漂荡,享受宁静与</div>
                                </li>
                                <li><a href="/article/2799.htm"
                                       title="php二进制安全的含义" target="_blank">php二进制安全的含义</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a>
                                    <div>PHP里,有string的概念。
string里,每个字符的大小为byte(与PHP相比,Java的每个字符为Character,是UTF8字符,C语言的每个字符可以在编译时选择)。
byte里,有ASCII代码的字符,例如ABC,123,abc,也有一些特殊字符,例如回车,退格之类的。
特殊字符很多是不能显示的。或者说,他们的显示方式没有标准,例如编码65到哪儿都是字母A,编码97到哪儿都是字符</div>
                                </li>
                                <li><a href="/article/2926.htm"
                                       title="Linux下禁用T440s,X240的一体化触摸板(touchpad)" target="_blank">Linux下禁用T440s,X240的一体化触摸板(touchpad)</a>
                                    <span class="text-muted">gashero</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/ThinkPad/1.htm">ThinkPad</a><a class="tag" taget="_blank" href="/search/%E8%A7%A6%E6%91%B8%E6%9D%BF/1.htm">触摸板</a>
                                    <div>自打1月买了Thinkpad T440s就一直很火大,其中最让人恼火的莫过于触摸板。 
  
Thinkpad的经典就包括用了小红点(TrackPoint)。但是小红点只能定位,还是需要鼠标的左右键的。但是自打T440s等开始启用了一体化触摸板,不再有实体的按键了。问题是要是好用也行。 
  
实际使用中,触摸板一堆问题,比如定位有抖动,以及按键时会有飘逸。这就导致了单击经常就</div>
                                </li>
                                <li><a href="/article/3053.htm"
                                       title="graph_dfs" target="_blank">graph_dfs</a>
                                    <span class="text-muted">hcx2013</span>
<a class="tag" taget="_blank" href="/search/Graph/1.htm">Graph</a>
                                    <div>package edu.xidian.graph;

class MyStack {
	private final int SIZE = 20;
	private int[] st;
	private int top;

	public MyStack() {
		st = new int[SIZE];
		top = -1;
	}

	public void push(i</div>
                                </li>
                                <li><a href="/article/3180.htm"
                                       title="Spring4.1新特性——Spring核心部分及其他" target="_blank">Spring4.1新特性——Spring核心部分及其他</a>
                                    <span class="text-muted">jinnianshilongnian</span>
<a class="tag" taget="_blank" href="/search/spring+4.1/1.htm">spring 4.1</a>
                                    <div>目录 
Spring4.1新特性——综述 
Spring4.1新特性——Spring核心部分及其他 
Spring4.1新特性——Spring缓存框架增强 
Spring4.1新特性——异步调用和事件机制的异常处理 
Spring4.1新特性——数据库集成测试脚本初始化 
Spring4.1新特性——Spring MVC增强 
Spring4.1新特性——页面自动化测试框架Spring MVC T</div>
                                </li>
                                <li><a href="/article/3307.htm"
                                       title="配置HiveServer2的安全策略之自定义用户名密码验证" target="_blank">配置HiveServer2的安全策略之自定义用户名密码验证</a>
                                    <span class="text-muted">liyonghui160com</span>

                                    <div>  
  
具体从网上看 
  
http://doc.mapr.com/display/MapR/Using+HiveServer2#UsingHiveServer2-ConfiguringCustomAuthentication 
  
 
  
   
   LDAP Authentication using OpenLDAP 
   Setting </div>
                                </li>
                                <li><a href="/article/3434.htm"
                                       title="一位30多的程序员生涯经验总结" target="_blank">一位30多的程序员生涯经验总结</a>
                                    <span class="text-muted">pda158</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/%E7%94%9F%E6%B4%BB/1.htm">生活</a><a class="tag" taget="_blank" href="/search/%E5%92%A8%E8%AF%A2/1.htm">咨询</a>
                                    <div>1.客户在接触到产品之后,才会真正明白自己的需求。 
  这是我在我的第一份工作上面学来的。只有当我们给客户展示产品的时候,他们才会意识到哪些是必须的。给出一个功能性原型设计远远比一张长长的文字表格要好。 2.只要有充足的时间,所有安全防御系统都将失败。 
  安全防御现如今是全世界都在关注的大课题、大挑战。我们必须时时刻刻积极完善它,因为黑客只要有一次成功,就可以彻底打败你。   3.</div>
                                </li>
                                <li><a href="/article/3561.htm"
                                       title="分布式web服务架构的演变" target="_blank">分布式web服务架构的演变</a>
                                    <span class="text-muted">自由的奴隶</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/Web/1.htm">Web</a><a class="tag" taget="_blank" href="/search/%E5%BA%94%E7%94%A8%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">应用服务器</a><a class="tag" taget="_blank" href="/search/%E4%BA%92%E8%81%94%E7%BD%91/1.htm">互联网</a>
                                    <div>最开始,由于某些想法,于是在互联网上搭建了一个网站,这个时候甚至有可能主机都是租借的,但由于这篇文章我们只关注架构的演变历程,因此就假设这个时候已经是托管了一台主机,并且有一定的带宽了,这个时候由于网站具备了一定的特色,吸引了部分人访问,逐渐你发现系统的压力越来越高,响应速度越来越慢,而这个时候比较明显的是数据库和应用互相影响,应用出问题了,数据库也很容易出现问题,而数据库出问题的时候,应用也容易</div>
                                </li>
                                <li><a href="/article/3688.htm"
                                       title="初探Druid连接池之二——慢SQL日志记录" target="_blank">初探Druid连接池之二——慢SQL日志记录</a>
                                    <span class="text-muted">xingsan_zhang</span>
<a class="tag" taget="_blank" href="/search/%E6%97%A5%E5%BF%97/1.htm">日志</a><a class="tag" taget="_blank" href="/search/%E8%BF%9E%E6%8E%A5%E6%B1%A0/1.htm">连接池</a><a class="tag" taget="_blank" href="/search/druid/1.htm">druid</a><a class="tag" taget="_blank" href="/search/%E6%85%A2SQL/1.htm">慢SQL</a>
                                    <div>由于工作原因,这里先不说连接数据库部分的配置,后面会补上,直接进入慢SQL日志记录。 
  
1.applicationContext.xml中增加如下配置: 
<bean abstract="true" id="mysql_database" class="com.alibaba.druid.pool.DruidDataSourc</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>