Javascript 基于XML文件(PHP、Jquery)的页面生成

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读取),然

因此,我需要在PHP页面中获取和使用XML数据作为搜索结果
问题-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>