您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關XML DOM是什么意思,小編覺得挺實用的,因此分享給大家學習,希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
XML 文檔對象模型定義訪問和操作XML文檔的標準方法。
DOM 將 XML 文檔作為一個樹形結構,而樹葉被定義為節點。
XML DOM 是:
用于 XML 的標準對象模型
用于 XML 的標準編程接口
中立于平臺和語言
W3C 的標準
XML DOM 定義了所有 XML 元素的對象和屬性,以及訪問它們的方法(接口)。
換句話說:
XML DOM 是用于獲取、更改、添加或刪除 XML 元素的標準。
XML DOM 節點
XML 文檔中的每個成分都是一個節點。
根據 DOM,XML 文檔中的每個成分都是一個節點。
DOM 是這樣規定的:
整個文檔是一個文檔節點
每個 XML 標簽是一個元素節點
包含在 XML 元素中的文本是文本節點
每一個 XML 屬性是一個屬性節點
注釋屬于注釋節點
請看下面的 XML 文件 (books.xml):
<?xml version="1.0" encoding="ISO-8859-1"?> <bookstore> <book category="children"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="cooking"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="web"> <title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> <book category="web"> <title lang="en">XQuery Kick Start</title> <author>James McGovern</author> <author>Per Bothner</author> <author>Kurt Cagle</author> <author>James Linn</author> <author>Vaidyanathan Nagarajan</author> <year>2003</year> <price>49.99</price> </book> </bookstore>
在上面的 XML 中,根節點是 <bookstore>。文檔中的所有其他節點都被包含在 <bookstore> 中。
根節點 <bookstore> 有四個 <book> 節點。
第一個 <book> 節點有四個節點:<title>, <author>, <year> 以及 <price>,其中每個節點都包含一個文本節點,"Harry Potter", "J K. Rowling", "2005" 以及 "29.99"。
在 DOM 處理中一個普遍的錯誤是,認為元素節點包含文本。
不過,元素節點的文本是存儲在文本節點中的。
在這個例子中:<year>2005</year>,元素節點 <year>,擁有一個值為 "2005" 的文本節點。
"2005" 不是 <year> 元素的值!
XML DOM 節點樹
XML DOM 把 XML DOM 文檔視為一棵節點樹 (node-tree)。
樹中的所有節點彼此之間都有關系。
XML DOM 把 XML 文檔視為一種樹結構。這種樹結構被稱為節點樹。
可通過這棵樹訪問所有節點。可以修改或刪除它們的內容,也可以創建新的元素。
這顆節點樹展示了節點的集合,以及它們之間的聯系。這棵樹從根節點開始,然后在樹的最低層級向文本節點長出枝條:
上面的圖片表示 XML 文件 books.xml。
節點樹中的節點彼此之間都有等級關系。
父、子和同級節點用于描述這種關系。父節點擁有子節點,位于相同層級上的子節點稱為同級節點(兄弟或姐妹)。
在節點樹中,頂端的節點成為根節點
根節點之外的每個節點都有一個父節點
節點可以有任何數量的子節點
葉子是沒有子節點的節點
同級節點是擁有相同父節點的節點
下面的圖片展示出節點樹的一個部分,以及節點間的關系:
因為 XML 數據是按照樹的形式進行構造的,所以可以在不了解樹的確切結構且不了解其中包含的數據類型的情況下,對其進行遍歷。
您將在本教程稍后的章節學習更多有關遍歷節點樹的知識。
注釋:父節點:Parent Node,子節點:Children Node,同級節點:Sibling Node。
請看下面的 XML 片段:
<bookstore> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> </bookstore>
在上面的 XML 中,<title> 元素是 <book> 元素的第一個子節點,而 <price> 元素是 <book> 元素的最后一個子節點。
此外,<book> 元素是 <title>、<author>、<year> 以及 <price> 元素的父節點。
解析 XML DOM
所有現代瀏覽器都內建了用于讀取和操作 XML 的 XML 解析器。
解析器把 XML 讀入內存,并把它轉換為可被 JavaScript 訪問的 XML DOM 對象。
微軟的 XML 解析器與其他瀏覽器中的解析器是有差異的。微軟的解析器支持對 XML 文件和 XML 字符串(文本)的加載,而其他瀏覽器使用單獨的解析器。不過,所有的解析器都含有遍歷 XML 樹、訪問、插入及刪除節點的函數。
在本教程中,我們將為您講解如何創建可在 IE 及其他瀏覽器中運行的腳本。
微軟的 XML 解析器內建于 Internet Explorer 5 及更高版本中。
下面的 JavaScript 片段把 XML 文檔 ("books.xml") 載入了解析器:
xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.load("books.xml");
第一行創建空的微軟 XML 文檔對象
第二行關閉異步加載,這樣可確保在文檔完整加載之前,解析器不會繼續執行腳本
第三行告知解析器加載名為 "books.xml" 的文檔
下面的 JavaScript 片段把名為 txt 的字符串載入解析器中:
xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.loadXML(txt);
注釋:loadXML() 方法用于加載字符串(文本),而load() 用于加載文件。
下面的 JavaScript 片段把 XML 文檔 ("books.xml") 載入了解析器:
xmlDoc=document.implementation.createDocument("","",null); xmlDoc.async="false"; xmlDoc.load("books.xml");
第一行創建空的 XML 文檔對象
第二行關閉異步加載,這樣可確保在文檔完整加載之前,解析器不會繼續執行腳本
第三行告知解析器加載名為 "books.xml" 的文檔
下面的 JavaScript 片段把名為 txt 的字符串載入解析器中:
parser=new DOMParser(); xmlDoc=parser.parseFromString(txt,"text/xml");
第一行創建一個空的 XML 文檔對象
第二行告知解析器加載名為 txt 的字符串
注釋:Internet Explorer 使用loadXML() 方法來解析 XML 字符串,而其他瀏覽器使用 DOMParser 對象。
下面的例子把 XML 文檔 ("books.xml") 載入 XML 解析器:
<html> <body> <script type="text/javascript"> try //Internet Explorer { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); } catch(e) { try //Firefox, Mozilla, Opera, etc. { xmlDoc=document.implementation.createDocument("","",null); } catch(e) {alert(e.message)} } try { xmlDoc.async=false; xmlDoc.load("books.xml"); document.write("xmlDoc is loaded, ready for use"); } catch(e) {alert(e.message)} </script> </body> </html>
出于安全方面的原因,現代的瀏覽器不允許跨域的訪問。
這意味著,網頁以及它試圖加載的 XML 文件,都必須位于相同的服務器上。
W3School 的實例所打開的 XML 文件位于 W3School 的域上。
假如你打算在自己的網頁上使用上面的例子,則必須把 XML 文件放到自己的服務器上。否則,xmlDoc.load() 將產生錯誤 "Access is denied"。
下面的代碼加載并解析了一個 XML 字符串:
<html> <body> <script type="text/javascript"> text="<bookstore>" text=text+"<book>"; text=text+"<title>Harry Potter</title>"; text=text+"<author>J K. Rowling</author>"; text=text+"<year>2005</year>"; text=text+"</book>"; text=text+"</bookstore>"; try //Internet Explorer { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); xmlDoc.async="false"; xmlDoc.loadXML(text); } catch(e) { try //Firefox, Mozilla, Opera, etc. { parser=new DOMParser(); xmlDoc=parser.parseFromString(text,"text/xml"); } catch(e) {alert(e.message)} } document.write("xmlDoc is loaded, ready for use"); </script> </body> </html>
XML DOM 加載函數
XML DOM 含有遍歷 XML 樹以及訪問、插入、刪除節點的方法(函數)。
然后,在訪問并處理 XML 文檔之前,必須把它載入 XML DOM 對象。
上一節演示了如何加載 XML 文檔。為了避免因加載文檔而重復編寫代碼,可以把代碼存儲在一個單獨的 JavaScript 文件中:
function loadXMLDoc(dname) { try //Internet Explorer { xmlDoc=new ActiveXObject("Microsoft.XMLDOM"); } catch(e) { try //Firefox, Mozilla, Opera, etc. { xmlDoc=document.implementation.createDocument("","",null); } catch(e) {alert(e.message)} } try { xmlDoc.async=false; xmlDoc.load(dname); return(xmlDoc); } catch(e) {alert(e.message)} return(null); }
上面的函數存儲在名為 "loadxmldoc.js" 的文件中。
下面的例子在其 <head> 部分有一個指向 "loadxmldoc.js" 的鏈接,并使用 loadXMLDoc() 函數加載 XML 文檔 ("books.xml"):
<html> <head><script type="text/javascript" src="loadxmldoc.js"></script> </head> <body> <script type="text/javascript"> xmlDoc=loadXMLDoc("books.xml"); document.write("xmlDoc is loaded, ready for use"); </script> </body> </html>
XML DOM - 屬性和方法
DOM 把 XML 模擬為一系列節點接口。可通過 JavaScript 或其他編程語言來訪問節點。在本教程中,我們使用 JavaScript。
對 DOM 的編程接口是通過一套標準的屬性和方法來定義的。
屬性經常按照“某事物是什么”的方式來使用(例如節點名是 "book")。
方法經常按照“對某事物做什么”的方式來使用(例如刪除 "book" 節點)。
一些典型的 DOM 屬性:
x.nodeName - x 的名稱
x.nodeValue - x 的值
x.parentNode - x 的父節點
x.childNodes - x 的子節點
x.attributes - x 的屬性節點
注釋:在上面的列表中,x 是一個節點對象。
x.getElementsByTagName(name) - 獲取帶有指定標簽名稱的所有元素
x.appendChild(node) - 向 x 插入子節點
x.removeChild(node) - 從 x 刪除子節點
注釋:在上面的列表中,x 是一個節點對象。
從 books.xml 中的 <title> 元素獲取文本的 JavaScript 代碼:
txt=xmlDoc.getElementsByTagName("title")[0].childNodes[0].nodeValue
在此語句執行后,txt 保存的值是 "Everyday Italian"。
xmlDoc - 由解析器創建的 XML DOM
getElementsByTagName("title")[0] - 第一個 <title> 元素
childNodes[0] - <title> 元素的第一個子節點 (文本節點)
nodeValue - 節點的值 (文本自身)
在上面的例子中,getElementsByTagName 是方法,而 childNodes 和 nodeValue 是屬性。
下面的代碼片段使用 loadXMLDoc 函數把 books.xml 載入 XML 解析器中,并顯示第一個 book 的數據:
xmlDoc=loadXMLDoc("books.xml"); document.write(xmlDoc.getElementsByTagName("title") [0].childNodes[0].nodeValue); document.write("<br />"); document.write(xmlDoc.getElementsByTagName("author") [0].childNodes[0].nodeValue); document.write("<br />"); document.write(xmlDoc.getElementsByTagName("year") [0].childNodes[0].nodeValue);
輸出:
Harry Potter J K. Rowling 2005
在上面的例子中,我們為每個文本節點使用 childNodes[0],即使每個元素只有一個文本節點。這是由于 getElementsByTagName() 方法總是會返回數組。
下面的代碼加載并解析一個 XML 字符串:
下面的代碼片段使用 loadXMLString 函數把 books.xml 載入 XML 解析器,并顯示第一個 book 的數據:
text="<bookstore>" text=text+"<book>"; text=text+"<title>Harry Potter</title>"; text=text+"<author>J K. Rowling</author>"; text=text+"<year>2005</year>"; text=text+"</book>"; text=text+"</bookstore>"; xmlDoc=loadXMLString(text); document.write(xmlDoc.getElementsByTagName("title") [0].childNodes[0].nodeValue); document.write("<br />"); document.write(xmlDoc.getElementsByTagName("author") [0].childNodes[0].nodeValue); document.write("<br />"); document.write(xmlDoc.getElementsByTagName("year") [0].childNodes[0].nodeValue);
輸出:
Harry Potter J K. Rowling 2005
您可以通過三種方法來訪問節點:
通過使用 getElementsByTagName() 方法
通過循環(遍歷)節點樹
通過利用節點的關系在節點樹中導航
getElementsByTagName() 返回擁有指定標簽名的所有元素。
node.getElementsByTagName("tagname");
下面的例子返回 x 元素下的所有 <title> 元素:
x.getElementsByTagName("title");
請注意,上面的例子僅返回 x 節點下的 <title> 元素。要返回 XML 文檔中的所有 <title> 元素,請使用:
xmlDoc.getElementsByTagName("title");
在這里,xmlDoc 就是文檔本身(文檔節點)。
getElementsByTagName() 方法返回節點列表 (node list)。節點列表是節點的數組。
下面的代碼通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中,然后在變量 x 中存儲 <title> 節點的一個列表:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("title");
可通過下標訪問 x 中的 <title> 元素。要訪問第三個 <title>,您可以編寫:
y=x[2];
注釋:下標以 0 起始。
在本教程中稍后的章節,您將學到更多有關 Node List 的知識。
length 屬性定義節點列表的長度(即節點的數目)。
您能夠通過使用 length 屬性來循環一個節點列表:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("title"); for (i=0;i<x.length;i++) { document.write(x[i].childNodes[0].nodeValue); document.write("<br />"); }
使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc
取得所有 <title> 元素節點
輸出每個 <title> 元素的文本節點的值
XML 文檔的 documentElement 屬性是根節點。
節點的 nodeName 屬性是節點的名稱。
節點的 nodeType 屬性是節點的類型。
您將在本教程的下一節中學習更多有關節點屬性的知識。
下面的代碼循環根節點的子節點,同時也是元素節點:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.documentElement.childNodes; for (i=0;i<x.length;i++) { if (x[i].nodeType==1) {//Process only element nodes (type 1) document.write(x[i].nodeName); document.write("<br />"); } }
通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中
獲得根元素的子節點
檢查每個子節點的節點類型。如果節點類型是 "1",則是元素節點
如果是元素節點,則輸出節點的名稱
下面的代碼通過利用節點的關系在節點樹中進行導航:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("book")[0].childNodes; y=xmlDoc.getElementsByTagName("book")[0].firstChild; for (i=0;i<x.length;i++) { if (y.nodeType==1) {//Process only element nodes (type 1) document.write(y.nodeName + "<br />"); } y=y.nextSibling; }
通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中
獲得第一個 book 元素的子節點
把 "y" 變量設置為第一個 book 元素的第一個子節點
檢查每個子節點的節點類型,如果節點類型是 "1",則是元素節點
如果是元素節點,則輸出該節點的名稱
把 "y" 變量設置為下一個同級節點,并再次運行循環
在 XML 文檔對象模型 (DOM) 中,每個節點都是一個對象。
對象擁有方法(功能)和屬性(關于對象的信息),并可通過 JavaScript 進行訪問和操作。
三個重要的 XML DOM 節點屬性是:
nodeName
nodeValue
nodeType
nodeName 屬性規定節點的名稱。
nodeName 是只讀的
元素節點的 nodeName 與標簽名相同
屬性節點的 nodeName 是屬性的名稱
文本節點的 nodeName 永遠是 #text
文檔節點的 nodeName 永遠是 #document
nodeValue 屬性規定節點的值。
元素節點的 nodeValue 是 undefined
文本節點的 nodeValue 是文本自身
屬性節點的 nodeValue 是屬性的值
下面的代碼檢索第一個 <title> 元素的文本節點的值:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("title")[0].childNodes[0]; txt=x.nodeValue;
結果:txt = "Everyday Italian"
通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中
獲取第一個 <title> 元素節點的文本節點
把 txt 變量設置為文本節點的值
下面的代碼更改第一個 <title> 元素的文本節點的值:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("title")[0].childNodes[0]; x.nodeValue="Easy Cooking";
通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中
獲取第一個 <title> 元素節點的文本節點
把文本節點的值更改為 "Easy Cooking"
nodeType 屬性規定節點的類型。
nodeType 是只讀的。
元素類型 | 節點類型 |
---|---|
元素 | 1 |
屬性 | 2 |
文本 | 3 |
注釋 | 8 |
文檔 | 9 |
當使用諸如 childNodes 或 getElementsByTagName() 屬性或方法時,會返回 NodeList 對象。
NodeList 對象表示節點的列表,以 XML 中的相同順序。
使用從 0 開始的下標來訪問節點列表中的節點。
下面的圖像表示 "books.xml" 中 <title> 元素的節點列表:
下面的代碼片段通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中,并返回 "books.xml" 中 title 元素的一個節點列表:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("title");
以上語句執行之后,x 成為一個 NodeList 對象。
下面的代碼片段從節點列表 x 中的第一個 <title> 元素中返回文本:
txt=x[0].childNodes[0].nodeValue;
在以上語句執行之后,txt = "Everyday Italian"。
NodeList 對象會保持自身的更新。如果刪除或添加了元素,列表會自動更新。
節點列表的 length 屬性是列表中節點的數量。
下面的代碼片段通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc,并返回 "books.xml" 中 <title> 元素的數量:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName('title').length;
在上面的語句執行之后,x = 4。
節點列表的長度可用于循環列表中所有的元素。
下面的代碼片段使用 length 屬性來遍歷 <title> 元素的列表:
xmlDoc=loadXMLDoc("books.xml"); //the x variable will hold a node list x=xmlDoc.getElementsByTagName('title'); for (i=0;i<x.length;i++) { document.write(x[i].childNodes[0].nodeValue); document.write("<br />"); }
輸出:
Harry Potter Everyday Italian XQuery Kick Start Learning XML
通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc
設置保存所有 title 元素的節點列表的 x 變量
從所有 <title> 元素的文本節點輸出值
元素節點的 attributes 屬性返回屬性節點的列表。
這被稱為 Named Node Map,除了方法和屬性上的一些差別以外,它與節點列表相似。
屬性列表會保持自身的更新。如果刪除或添加屬性,這個列表會自動更新。
下面的代碼片段通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中,并從 "books.xml" 中的第一個 <book> 元素返回屬性節點的一個列表:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName('book')[0].attributes;
以上代碼執行之后,x.length 等于屬性的數量,可使用 x.getNamedItem() 返回屬性節點。
下面的代碼片段一個 book 的 "category" 屬性的值,以及其屬性的數量:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("book")[0].attributes; document.write(x.getNamedItem("category").nodeValue); document.write("<br />" + x.length);
輸出:
children 1
通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中
把 x 變量設置為第一個 <book> 元素的所有屬性的一個列表
從 "category" 屬性輸出其值
輸出屬性列表的長度
遍歷 (Traverse) 意味著在節點樹中進行循環或移動。
下面的例子使用 XML 文件 books.xml。
函數 loadXMLString(),位于外部 JavaScript 中,用于加載 XML 文件。
遍歷一棵節點樹
循環 <book> 元素的所有子節點。
您經常需要循環 XML 文檔,比如:當你需要提取每個元素的值時。
這個過程叫作“遍歷節點樹”。
下面的例子循環 <book> 的所有子節點,并顯示它們的名稱和值:
<html> <head> <script type="text/javascript" src="loadxmlstring.js"></script> </head> <body> <script type="text/javascript"> text="<book>"; text=text+"<title>Harry Potter</title>"; text=text+"<author>J K. Rowling</author>"; text=text+"<year>2005</year>"; text=text+"</book>"; xmlDoc=loadXMLString(text); // documentElement always represents the root node x=xmlDoc.documentElement.childNodes; for (i=0;i<x.length;i++) { document.write(x[i].nodeName); document.write(": "); document.write(x[i].childNodes[0].nodeValue); document.write("<br />"); } </script> </body> </html>
輸出:
title: Harry Potter author: J K. Rowling year: 2005
loadXMLString() 把 XML 字符串載入 xmlDoc 中
獲取根元素的子節點
輸出每個子節點的名稱,以及文本節點的節點值
通過節點間的關系訪問節點樹中的節點,通常稱為定位節點 ("navigating nodes")。
在 XML DOM 中,節點的關系被定義為節點的屬性:
parentNode
childNodes
firstChild
lastChild
nextSibling
previousSibling
下面的圖像展示了 books.xml 中節點樹的一個部分,并說明了節點之間的關系:
所有的節點都僅有一個父節點。下面的代碼定位到 <book> 的父節點:
xmlDoc=loadXMLDoc("books.xml"); x=xmlDoc.getElementsByTagName("book")[0]; document.write(x.parentNode.nodeName);
通過使用 loadXMLDoc() 把 "books.xml" 載入到 xmlDoc 中
獲取第一個 <book> 元素
輸出 "x" 的父節點的節點名
TIY
Firefox,以及其他一些瀏覽器,把空的空白或換行當作文本節點,而 IE 不會這么做。
這會在使用下列屬性使產生一個問題:firstChild、lastChild、nextSibling、previousSibling。
為了避免定位到空的文本節點(元素節點之間的空格和換行符號),我們使用一個函數來檢查節點的類型:
function get_nextSibling(n) { y=n.nextSibling; while (y.nodeType!=1) { y=y.nextSibling; } return y; }
有了上面的函數,我們就可以使用 get_nextSibling(node) 來代替 node.nextSibling 屬性。
元素節點的類型是 1。如果同級節點不是元素節點,就移動到下一個節點,直到找到元素節點為止。通過這個辦法,在 IE 和 Firefox 中,都可以得到相同的結果。
下面的代碼顯示第一個 <book> 的第一個元素節點:
<html> <head> <script type="text/javascript" src="loadxmldoc.js"> </script> <script type="text/javascript"> //check if the first node is an element node function get_firstChild(n) { y=n.firstChild; while (y.nodeType!=1) { y=y.nextSibling; } return y; } </script> </head> <body> <script type="text/javascript"> xmlDoc=loadXMLDoc("books.xml"); x=get_firstChild(xmlDoc.getElementsByTagName("book")[0]); document.write(x.nodeName); </script> </body> </html>
輸出:
title
通過使用 loadXMLDoc() 把 "books.xml" 載入 xmlDoc 中
在第一個 <book> 上使用 get_firstChild 函數,來獲取元素節點中的第一個子節點
輸出第一個子節點(屬于元素節點)的節點名
以上就是XML DOM是什么意思,小編相信有部分知識點可能是我們日常工作會見到或用到的。希望你能通過這篇文章學到更多知識。更多詳情敬請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。