到目前为止你所看到的范例script 程序中,都是借着浏览节点的阶层结构,利用childNodes 与firstChild 两个节点属性来从某节点往相邻节点移动。
到目前为止你所看到的范例script 程序中,都是借着浏览节点的阶层结构,利用childNodes 与firstChild 两个节点属性来从某节点往相邻节点移动。记住,你可以用类似的方法来使用lastChild、previousSibling、nextSibling 和parentNode 等节点属性。表格9-2 详细描述了这些节点属性。
注意
childNodes、firstChild 与lastChild 属性只准许你存取非属性的子节点,而previousSibling 与nextSibling 属性则让你可以存取任何形态的兄弟节点。
另一种存取XML 元素的方法,是使用getElementsByTagName 方法来撷取拥有特殊形态名称的所有元素(像TITLE)。这个方法在Document 节点(于表格9-3 中介绍)以及Element 节点(于表格9-6 中介绍)都可以使用。如果你为Document 节点呼叫这个方法,它会传回文件中所有拥有特定型态名称元素的Element 节点集合。例如,下面的程序代码会取得文件中所有为BOOK 形态元素的Element 节点集合:
NodeList =Document.getElementsByTagName("BOOK ");
如果呼叫Element 节点的getElementsByTagName 方法,如下面例子所示,则方法将传回所有符合条件的子Element 节点集合:
NodeList =Element.getElementsByTagName("AUTHOR ");
提示
如果你传入「*」值给getElementsByTagName 方法,其将传回所有元素的节点集合。(如果你呼叫的是Document 对象的方法,则其会传回文件中所有元素的集合;如果呼叫的是Element对象的方法,则其会传回所有后继元素的集合。)
Element 节点方法节点方法 描述 范例 getAttribute(attr-name) 传回拥有特定名称的Element 属性的属性值 AttValue =Element.getAttribute("InStock"); GetAttributeNode(attr-name) 传回代表拥有特定名称的Element 属性的Attribute 节点 Attribute=Element.getAttributeNode("InStock"); getElementsByTagName(type-name) 传回该元素中拥有特定型态的所有后继元素的Element节点的NodeList对象。.如果你传入参数值「*」时,方法将传回所有代表后继元素的节点 AuthorElementCollection=Element.getElementsByTagName("AUTHOR"); 表格9-6 Element 节点所提供有用的方法。在Element 节点中你也可以使用表格9-2 中所列的共同节点属性。
getElementsByTagName 方法以NodeList 集合对象的形态,传回给Element 节点。因此你可以使用本章先前在<使用NodeList 对象>中讨论过的任何技术,来存取个别的节点。例如,下面的script 程序,将显示(藉由「alert」的讯息显示框)由getElementsByTagName 方法所传回的NodeList 对象中所有Element 节点的文字内容:
for (i=0;i <NodeList.length;++i)
alert (NodeList(i).text);
列表9-5 的HTML 网页显示了在Document 节点中使用getElements-ByTagName 方法的用法。(你可以在随书光盘中的GetElements.htm 档案中找到列表9-5。)该网页显示一个文字(TEXT)形态的输入(INPUT)控件,让你可以输入元素名称。当你按下 Show Elements 按钮时,script中的ShowElements 函式将在文件节点中使用getElementsByTagName 方法来搜寻,并显示文件中符合输入元素名称的所有元素XML 卷标的内容。注意,script 中使用每个Element 节点的xml 属性来显示元素的XML 卷标内容。网页一开始就被连结至文件Inventory.xml 中,虽然你可以编辑文件中的data island来显示其它XML文件中的元素。下图是在你输入AUTHOR到INPUT
控件并按下按钮时,Internet Explorer 5 显示该网页的情况。
GetElements.htm
<!--File Name:GetElements.htm -->
<HTML>
<HEAD>
<TITLE>Element Finder</TITLE>
<SCRIPT LANGUAGE="javascript">
function ShowElements()
{
/*make sure user has entered text into the
''Element name'' box::*/
if (ElementName.value =="")
{
ResultDiv.innerText ="<You must enter an
element"
+"name into ''Element name'' box..>";
return;
}
/*get a NodeList collection of all matching Element
nodes in the document:*/
Document =dsoXML.XMLDocument;
NodeList =
Document.getElementsByTagName
(ElementName.value);
/*store the XML markup for each Element node
in ResultHTML:*/
ResultHTML ="";
for (i=0;i <NodeList.length;++i)
ResultHTML +=NodeList(i).xml +"\n \n";
/*assign the stored results to the innerText property
of the DIV:*/
if (ResultHTML =="")
ResultDiv.innerText ="<no matching elements
found>";
else
ResultDiv.innerText =ResultHTML;
}
</SCRIPT>
</HEAD>
<BODY>
<XML ID="dsoXML" src=http://www.ddvip.com/web/xml/index1/"Inventory.xml"></XML>
<H2>Find Elements by Element Name</H2>
Element name:<INPUT TYPE="TEXT" ID="ElementName">
<BUTTON onCLICK="ShowElements()">Show Elements</BUTTON>
<HR>
<DIV ID=ResultDiv></DIV>
</BODY>
</HTML>