Javascript 基于XML文件(PHP、Jquery)的页面生成
因此,我需要在PHP页面中获取和使用XML数据作为搜索结果Javascript 基于XML文件(PHP、Jquery)的页面生成,javascript,php,jquery,html,xml,Javascript,Php,Jquery,Html,Xml,因此,我需要在PHP页面中获取和使用XML数据作为搜索结果 问题-XML的结构非常糟糕(一个带有指向其他XML文件的链接的“索引”文件),整个文件的大小是huuuge(从1000到20+K XML文件,总共10 MB或更多)。 我研究了很多不同的工具:XMLreader、XML解析器和一些JQuery。但我不确定哪一个更适合这项任务 我认为解决这个问题的最佳方法是facebook风格的“按以加载更多”页面,它加载自己,加载“索引”XML(可能在隐藏的输入字段或div中,以便JQuery读取),然
问题-XML的结构非常糟糕(一个带有指向其他XML文件的链接的“索引”文件),整个文件的大小是huuuge(从1000到20+K XML文件,总共10 MB或更多)。
我研究了很多不同的工具:XMLreader、XML解析器和一些JQuery。但我不确定哪一个更适合这项任务
我认为解决这个问题的最佳方法是facebook风格的“按以加载更多”页面,它加载自己,加载“索引”XML(可能在隐藏的输入字段或div中,以便JQuery读取),然后开始主动读取索引中列出的XML文件,并在页面上动态生成结果。我确实需要将所有数据存储在某种内存中,因为我还需要对其进行分析
问题:哪一种更好地用于it以及我会从中受益的任何技术?还是我完全从错误的角度看问题?
我尝试使用XMLreader和解析器以及SimpleXMLElement+for=loop读取PHP,但一旦我将第二次读取(从“索引”中)放入等式,页面就会因加载时间过大而中断,这是在30MB/s的internet上。我对JQuery没有太多经验,所以我要征求意见。
另外,我从
中获取XML 较小的“索引”示例:
如果在每个“url”中添加“?displayxml=true”,则我需要读取一个XML文件。您可以使用clinicaltrials.gov XML并将其转换为正常的XML格式,包括HTML。XSL是一种用于转换XML的语言 PHP甚至有一个内置的XSL处理器: 另一方面,我使用XSL将DocBook XML文件(一种语义标记语言)转换为Twitter引导HTML 例如,使用您提供的示例(),如果您希望将所有临床研究的标题显示为列表,则以下XSL样式表可以完成此工作:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" omit-xml-declaration="yes" indent="no"/>
<xsl:template match="/">
<ul>
<xsl:apply-templates/>
</ul>
</xsl:template>
<xsl:template match="search_results">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="clinical_study">
<li><xsl:value-of select="title"/></li>
</xsl:template>
</xsl:stylesheet>
XSL样式表在文档的根处输入源XML文档。然后它穿过树。只要找到与定义的模板匹配的元素,它就会执行该模板。很酷的东西!将自己定位到XSL编程范式需要一段时间,但一旦掌握了窍门,它就会非常强大
请注意,我只是把它作为一个玩具的例子写在我的头上。我不确定这是否会正确执行
编辑1:
(OP询问执行分析的情况,例如计算特定类型的所有元素)
查看示例XML结果,确定试验是否处于第3阶段的唯一方法似乎是检查
元素的文本。这仍然很容易在XSL的功能范围内实现(借助XPath的一些帮助)
我要再次警告你,这只是我头脑中的一个例子 我要做的是:
由于该站点提供了一些有用的查询字符串,如&count=
,请利用这一优势
这意味着您实际上不需要处理和查询数以万计的行
所以通常,您只需像这样查询外部站点:
http://www.clinicaltrials.gov/search?term=heart%20attack&count=10&displayxml=true&pg=1
所以只要限制每一个请求。示例:10
然后开始构建服务器端
客户端站点由您决定,这只是个人偏好,但在本例中我将使用DataTables
下面的代码只是在上面的示例url中重新创建了相同的结构:
$search_term = 'attack';
$count = 10;
$query = http_build_query(array(
'term' => $search_term,
'count' => $count,
'displayxml' => 'true',
'pg' => $draw,
));
$main_url = 'http://www.clinicaltrials.gov/search?' . $query;
构建正确的URL后,只需请求所需的XML。最终,在收集了所有需要的数据(分块数据)之后。在客户端显示它
完整示例:也
index.php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$draw = isset($_POST['draw']) ? $_POST['draw'] : 1;
$search_term = 'attack';
$count = 10;
$query = http_build_query(array(
'term' => $search_term,
'count' => $count,
'displayxml' => 'true',
'pg' => $draw,
));
$main_url = 'http://www.clinicaltrials.gov/search?' . $query;
$contents = file_get_contents($main_url);
$xml = simplexml_load_string($contents);
$total_results = (string) $xml->attributes()['count'];
$data = array();
$data['draw'] = $draw;
$data['recordsTotal'] = $total_results;
$data['recordsFiltered'] = $total_results;
foreach($xml->clinical_study as $entry) {
$data['data'][] = json_decode(json_encode($entry), true);
}
echo json_encode($data);
exit;
}
?>
<link rel="stylesheet" type="text/css" href="http://cdn.datatables.net/1.10.2/css/jquery.dataTables.css" />
<table border="1" class="display dataTable" cellspacing="0" width="100%">
<thead>
<tr>
<th>Order</th>
<th>Score</th>
<th>Nct ID</th>
<th>URL</th>
<th>Title</th>
<th>Status</th>
<th>Condition Summary</th>
<th>Last Changed</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Order</th>
<th>Score</th>
<th>Nct ID</th>
<th>URL</th>
<th>Title</th>
<th>Status</th>
<th>Condition Summary</th>
<th>Last Changed</th>
</tr>
</tfoot>
</table>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.display').dataTable({
'processing': true,
'serverSide': true,
'ajax': {
'url': document.URL,
'type': 'POST',
},
"columns": [
{ "data": "order" },
{ "data": "score" },
{ "data": "nct_id" },
{ "data": "url" },
{ "data": "title" },
{ "data": "status" },
{ "data": "condition_summary" },
{ "data": "last_changed" },
],
bFilter: false, bInfo: false, bSort: false,
});
});
</script>
if($\u服务器['REQUEST\u METHOD']=='POST'){
$draw=isset($_POST['draw'])?$_POST['draw']:1;
$search_term='attack';
$count=10;
$query=http\u build\u query(数组(
“术语”=>$search\u术语,
“count”=>count美元,
'displayxml'=>'true',
“pg”=>$draw,
));
$main\u url='1http://www.clinicaltrials.gov/search?“.$query;
$contents=file\u get\u contents($main\u url);
$xml=simplexml\u load\u字符串($contents);
$total_results=(字符串)$xml->attributes()['count'];
$data=array();
$data['draw']=$draw;
$data['recordsTotal']=$total\u结果;
$data['recordsFiltered']=$total\u结果;
foreach($xml->clinical\u study作为$entry){
$data['data'][]=json_decode(json_encode($entry),true);
}
echo json_编码($data);
出口
}
?>
命令
分数
Nct ID
统一资源定位地址
标题
地位
情况摘要
最后更改
命令
分数
Nct ID
统一资源定位地址
标题
地位
情况摘要
最后更改
$(文档).ready(函数(){
$('.display').dataTable({
“处理”:正确,
“服务器端”:正确,
“ajax”:{
“url”:document.url,
'type':'POST',
},
“栏目”:[
{“数据”:“顺序”},
{“数据”:“分数”},
{“数据”:“nct_id”},
{“数据”:“url”},
{“数据”:“标题”},
{“数据”:“状态”},
{“数据”:“条件汇总”},
{“数据”:“上次更改”},
],
bFilter:false,bInfo:false,bSort:false,
});
});
这里的基本思想是,你真的不需要立即请求那一千行。您可以将它们分块调用。在您的url示例中,有
1856
r
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$draw = isset($_POST['draw']) ? $_POST['draw'] : 1;
$search_term = 'attack';
$count = 10;
$query = http_build_query(array(
'term' => $search_term,
'count' => $count,
'displayxml' => 'true',
'pg' => $draw,
));
$main_url = 'http://www.clinicaltrials.gov/search?' . $query;
$contents = file_get_contents($main_url);
$xml = simplexml_load_string($contents);
$total_results = (string) $xml->attributes()['count'];
$data = array();
$data['draw'] = $draw;
$data['recordsTotal'] = $total_results;
$data['recordsFiltered'] = $total_results;
foreach($xml->clinical_study as $entry) {
$data['data'][] = json_decode(json_encode($entry), true);
}
echo json_encode($data);
exit;
}
?>
<link rel="stylesheet" type="text/css" href="http://cdn.datatables.net/1.10.2/css/jquery.dataTables.css" />
<table border="1" class="display dataTable" cellspacing="0" width="100%">
<thead>
<tr>
<th>Order</th>
<th>Score</th>
<th>Nct ID</th>
<th>URL</th>
<th>Title</th>
<th>Status</th>
<th>Condition Summary</th>
<th>Last Changed</th>
</tr>
</thead>
<tfoot>
<tr>
<th>Order</th>
<th>Score</th>
<th>Nct ID</th>
<th>URL</th>
<th>Title</th>
<th>Status</th>
<th>Condition Summary</th>
<th>Last Changed</th>
</tr>
</tfoot>
</table>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script src="http://cdn.datatables.net/1.10.2/js/jquery.dataTables.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('.display').dataTable({
'processing': true,
'serverSide': true,
'ajax': {
'url': document.URL,
'type': 'POST',
},
"columns": [
{ "data": "order" },
{ "data": "score" },
{ "data": "nct_id" },
{ "data": "url" },
{ "data": "title" },
{ "data": "status" },
{ "data": "condition_summary" },
{ "data": "last_changed" },
],
bFilter: false, bInfo: false, bSort: false,
});
});
</script>