给梦一个奔跑的方向!
PDF Print E-mail
User Rating: / 0
PoorBest 
Written by xlingfairy
Thursday, 19 November 2009 11:30
xml 可以有0个或多个 namespace。读取不带 namespace 的xml 内容非常容易,但是读取带 namespace 的 xml 内容,就没那么容易了。
 
这里提供 ff/chrome 等浏览器支持的函数:evaluate 原型:
 
XPathResult evaluate(String xpathText,
                     Node contextNode,
                     Function namespaceURLMapper,
                     short resultType,
                     XPathResult result)
    tHRows DOMException, XPathException
 
dom.evaluate("//item",dom, null,XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
 
你可以搜,namespaceURLMapper 基本上你是找不到怎么写的。
这里我提供一个写法,我也没有搜到怎么写,但是我猜到了:
var namespaceUrlMapper = function( prefix ){
var url = "";
switch(prefix){
case "dxp":
url = "http://schemas.google.com/analytics/2009";
break;
case "openSearch":
url = "http://a9.com/-/spec/opensearchrss/1.0/";
}
return url;
}
 
之后,你可以这样写:
var result = dom.evaluate("//dxp:metric",dom, namespaceUrlMapper,XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
 
以下是示例(http://jobj.googlecode.com/svn/trunk/namespace.html):
注意,不能在IE 下运行,因为 evaluate 在 ie 下对应的函数是 selectSingleNode , selectNodes
请将:JObj.Xml.loadXML 换成你自己的处理方式。
 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<script src="/JObj.js" type="text/javascript"></script>
</head>
 
<body>
<span id="xml">
<!--
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:dxp='http://schemas.google.com/analytics/2009'>
<id>http://www.google.com/analytics/feeds/data?ids=ga:3879045&amp;dimensions=ga:month&amp;metrics=ga:pageviews,ga:uniquePageviews&amp;filters=ga:pagePath%3D~%26rid%
 
3D51&amp;start-date=2009-01-01&amp;end-date=2009-04-30</id>
<updated>2009-04-30T16:59:59.999-07:00</updated>
<title type='text'>Google Analytics Data for Profile 3879045</title>
<link rel='self' type='application/atom+xml' href='http://www.google.com/analytics/feeds/data?sort=ga%3Amonth&amp;end-date=2009-04-30&amp;start-date=2009-01-
 
01&amp;metrics=ga%3Apageviews%2Cga%3AuniquePageviews&amp;ids=ga%3A3879045&amp;dimensions=ga%3Amonth&amp;filters=ga%3ApagePath%3D%7E%26rid%3D51'/>
<author>
<name>Google Analytics</name>
</author>
<generator version='1.0'>Google Analytics</generator>
<openSearch:totalResults>4</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<openSearch:itemsPerPage>100</openSearch:itemsPerPage>
<dxp:startDate>2009-01-01</dxp:startDate>
<dxp:endDate>2009-04-30</dxp:endDate>
<dxp:aggregates>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='924'/>
<dxp:metric confidenceInterval='0.0' name='ga:uniquePageviews' type='integer' value='840'/>
</dxp:aggregates>
<dxp:dataSource>
<dxp:tableId>ga:3879045</dxp:tableId>
<dxp:tableName>www.xxx.nz</dxp:tableName>
<dxp:property name='ga:profileId' value='3879045'/>
<dxp:property name='ga:webPropertyId' value='UA-1779958-2'/>
<dxp:property name='ga:accountName' value='12rmb'/>
</dxp:dataSource>
<entry>
<id>http://www.google.com/analytics/feeds/data?ids=ga:3879045&amp;ga:month=01&amp;filters=ga:pagePath%3D~%26rid%3D51&amp;start-date=2009-01-01&amp;end-date=2009
 
-04-30</id>
<updated>2009-04-29T17:00:00.001-07:00</updated>
<title type='text'>ga:month=01</title>
<link rel='alternate' type='text/html' href='http://www.google.com/analytics'/>
<dxp:dimension name='ga:month' value='01'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='0'/>
<dxp:metric confidenceInterval='0.0' name='ga:uniquePageviews' type='integer' value='0'/>
</entry>
<entry>
<id>http://www.google.com/analytics/feeds/data?ids=ga:3879045&amp;ga:month=02&amp;filters=ga:pagePath%3D~%26rid%3D51&amp;start-date=2009-01-01&amp;end-date=2009
 
-04-30</id>
<updated>2009-04-29T17:00:00.001-07:00</updated>
<title type='text'>ga:month=02</title>
<link rel='alternate' type='text/html' href='http://www.google.com/analytics'/>
<dxp:dimension name='ga:month' value='02'/>
<dxp:metric confidenceInterval='0.0' name='ga:pageviews' type='integer' value='0'/>
<dxp:metric confidenceInterval='0.0' name='ga:uniquePageviews' type='integer' value='0'/>
</entry>
</feed>
-->
</span>
<script type="text/javascript">
var namespaceUrlMapper = function( prefix ){
var url = "";
switch(prefix){
case "dxp":
url = "http://schemas.google.com/analytics/2009";
break;
case "openSearch":
url = "http://a9.com/-/spec/opensearchrss/1.0/";
}
return url;
}
 
var xml = JObj.$("xml").innerHTML.replace(/<!--|-->/g,"").trim();
var dom = JObj.Xml.loadXML(xml);
var result = dom.evaluate("//dxp:metric",dom, namespaceUrlMapper,XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);
while( metric = result.iterateNext()){
alert(metric.xml);
}
 
result = dom.evaluate("//openSearch:*", dom , namespaceUrlMapper, XPathResult.ORDERED_NODE_ITERATOR_TYPE  , null);
while( metric = result.iterateNext()){
alert( metric.nodeName + " = " +  metric.firstChild.nodeValue);
}
</script>
</body>
</html>
 
 
 
说明:
 
XPathResult 提供两种方法,但是需要注意使用:
1,iterateNext( )
Returns the next node in the node set. Use this method if the resultType is
只能使用于:UNORDERED_NODE_ITERATOR_TYPE , ORDERED_NODE_ITERATOR_TYPE 的结果。
 
2,snapshotItem( )
Returns the node at the specified index in the list of result nodes. This method may be used
只能用于:UNORDERED_NODE_SNAPSHOT_TYPE , ORDERED_NODE_SNAPSHOT_TYPE 的结果。
 
XPathResult 提供了 booleanValue, numberValue, stringValue , snapshotLength, resultType 这几个属性。在判断该使用 iterateNext 还是该使用 snapshotItem 之前,最好要判断一下 
 
resultType 这个属性的值:
 
ANY_TYPE 0 
返回不确定类型。该方法返回的类型由表达式计算的结果决定
NUMBER_TYPE 1
返回数字值
STRING_TYPE 2
返回字符串值
OOLEAN_TYPE 3
返回布尔值
 
UNORDERED_NODE_ITERATOR_TYPE 4
返回可以遍历的节点集合,然而,节点的顺序与其在文档中出现的顺序不一定一致。
ORDERED_NODE_ITERATOR_TYPE 5
返回文档顺序的节点集合(使用iterateNext()方法遍历)。因此,可以容易地访问集合中每个独立的节点。
 
UNORDERED_NODE_SNAPSHOT_TYPE 6
返回无序快照节点集合。任何对文档中节点的修改都不影响结果
ORDERED_NODE_SNAPSHOT_TYPE 7
回文档顺序的节点集合(结果集合的快照)。任何对文档中节点的修改都不影响结果。
 
ANY_UNORDERED_NODE_TYPE  8
返回通过singleNodeValue属性访问的某个节点的节点集合,如果没有匹配的节点,那么返回null。返回的节点集合不一定按出现的顺序排列。
FIRST_ORDERED_NODE_TYPE 9
返回某个节点的节点集合。该节点使用XPathResult类的singleNodeValue属性访问。返回的节点是文档中第一个出现的节点。
 
具体参见我以前的记录
 
 

Add comment


Security code
Refresh

Popular Contents

Recommend

Site Info

Members : 1
Content : 100
Web Links : 7
Content View Hits : 56181

Links