近日处理一个客户的系统,使用ajax调用sharepoint的webservice接口。
ajax使用jquery当然是最方便的了,jquery.ajax调用后返回的是一个xml对象,或者说是一个xml文件,我们需要的数据就在xml文件中。
但是碰到了一个棘手的问题,在我们查找的项目中,有一个条目的属性值是含有单引号“’”的,例如<z:row ows_title=”today’s work” ows_data=”10” …>
var xmldata = $(datas).find( "book xmldata[ows_title=/"today’s work/"]" );
这样jquery抛出异常,是单引号的问题,在网上找了许久,说可以使用转义符的、使用concat的,但是都报错
var xmldata = $(datas).find( "book xmldata[ows_title=/"today/’s work/"]" );
var xmldata = $(datas).find( "book xmldata[ows_title=concat(/"today/" + /"'/" + /"s work/")]" );
均报错。
通过字符转换的方式看是不行了,所以闪出了修改源数据的想法。
如何修改,其实也是通过debugger;的方式得出的灵感。
xml文件是这样的:
———book.xml—————
<?xml version="1.0" encoding="utf-8"?>
<catalog>
<book format="trade">
<name>Jennifer Government</name>
<author>Max Barry</author>
<price curr="CAD">15.00</price>
<price curr="USD">12.00</price>
</book>
<book format="textbook">
<name>Unity Game Development Essentials</name>
<author>Will Goldstone</author>
<price curr="CAD">52.00</price>
<price curr="USD">45.00</price>
</book>
<book format="textbook">
<name>UNIX Visual QuickPro</name>
<author>Chris Herborth</author>
<price curr="CAD">15.00</price>
<price curr="USD">10.00</price>
<price curr="mycurr">10.00</price>
<xmldata xname="apen's pars" data="1" />
<xmldata xname="pars1" data="2" />
<xmldata xname="pars2" data="3" />
<xmldata xname="pars3" data="4" />
<xmldata xname="pars7" data="5" />
<xmldata xname="pars6" data="6" />
<xmldata xname="pars4" data="7" />
<xmldata xname="apen's pars" data="8" />
<xmldata xname="apen's pars" data="9" />
</book>
<book format="textbook">
<name>Unity Game Development Essentials</name>
<author>Will Goldstone</author>
<price curr="CAD">52.00</price>
</book>
</catalog>
————————
现在看一下我修改后的代码:
———jquery_find.htm—————
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8"/>
<title>Book Catalog</title>
<script type="text/javascript"
src="scripts/jquery-1.3.2-vsdoc2.js"></script>
<script type="text/javascript">// <![CDATA[
var root = null;
$(document).ready( function(){
$.get( "http://localhost/szxnyi/book.xml",
function( data ) {
//debugger;
root = data;
$("p#status").text( "Loaded." );
} );
$("#btn_test").click(function(){
$("#xml_text").val(root.xml);
//debugger;
//debugger;
var xmldata = $(root).find( "book xmldata" );
$("#ta_xmldata").val($(xmldata).length);
var xname_list = "";
$(xmldata).each(function(){
xname_list += " /n/r" + $(this).attr("xname");
});
$("#ta_xmldata").val($("#ta_xmldata").val() + xname_list);
var exp = //'/g;
//过滤调单引号(替换成中文格式的单引号,你也可以转成其它你认为合适的字符)
var x_root = root.xml.replace(exp, "‘");
//var find_str = "apen's pars";
var find_str = "apen‘s pars";
//通过过滤的xml代码 创建一个xml对象,
var xml_obj = new xml(x_root);
var xmldata2 = $(xml_obj).find( "book xmldata[xname=/""+find_str+"/"]" );
var xmldata_str = "";
var c = 0;
$(xmldata2).each(function(){
c ++;
xmldata_str += " /n/r data" + c.toString() + ":" + $(this).attr("data");
});
$("#ta_xmldata").val("找到数目:" + xmldata2.length + xmldata_str);
});
} );
// ]]>
//创建一个xml文件
function xml(str){
if(window.DOMParser)//firefox内核的浏览器
{
var p = new DOMParser();
return p.parseFromString( str, "text/xml" );
}
else if( window.ActiveXObject )//ie内核的浏览器
{
var doc = new ActiveXObject( "Msxml2.DOMDocument" );
doc.loadXML(str);
return doc;
}
else
return false;
}
</script>
</head>
<body>
<p id="status">
Loading book.xml...
</p>
<textarea rows="10" cols="100" id="xml_text"></textarea>
<br />
<div>find xname="apen's pars"</div>
<br />
<textarea rows="10" cols="100" id="ta_xmldata"></textarea>
<div id="test_div"></div>
<input type="button" id="btn_test" value="test" />
</body>
</html>
--------------