小编Hed*_*ips的帖子

如何使用PHP Curl解析xml站点地图并单独加载每个URL

我正在尝试编写一个脚本,该脚本将读取远程sitemap.xml并解析其中的url,然后依次加载每个脚本以预先缓存它们以便更快地浏览.

背后的原因:我们正在开发的系统在运行时将DITA XML写入浏览器,并且第一次加载页面时,等待时间可能在8-10秒之间.之后的后续加载可能只需1秒.显然,对于更好的用户体验,预先缓存的页面是一个奖励.

每次我们在此服务器上准备新发布或执行任何测试/修补时,我们都必须清除缓存,以便编写一个脚本来解析站点地图并加载每个URL.

在做了一些阅读后,我认为最好的路线是使用PHP和Curl.这是不是一个好主意我不知道.我对Perl更熟悉,但目前系统上既没有安装PHP也没有Perl,所以我觉得在PHP池中蘸我的脚趾可能会很好.

到目前为止,我抓住"teh internets"的代码读取了sitemap.xml,并将其写入我们服务器上的xml文件,并在浏览器中显示.据我所知,这只是一次性转储整个文件?

<?php
$ver = "Sitemap Parser version 0.2";
echo "<p><strong>". $ver . "</strong></p>";


$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://ourdomain.com/sitemap.xml;jsessionid=1j1agloz5ke7l?id=1j1agloz5ke7l');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec ($ch);
curl_close ($ch);
if (@simplexml_load_string($xml)) {
    $fp = fopen('feed.xml', 'w');
    fwrite($fp, $xml);
    echo $xml;
    fclose($fp);
}
?>
Run Code Online (Sandbox Code Playgroud)

而不是将整个文档转储到文件或屏幕中,最好遍历xml结构,只需抓住我需要的URL.

xml采用以下格式:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9&#x9;http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
    <url>
        <loc>http://ourdomain.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4</loc>
        <lastmod>2011-03-31T11:25:01.984+01:00</lastmod>
        <changefreq>monthly</changefreq>
        <priority>1.0</priority>
    </url>
    <url>
        <loc>http://ourdomain.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_9</loc>
        <lastmod>2011-03-31T11:25:04.734+01:00</lastmod>
        <changefreq>monthly</changefreq>
        <priority>1.0</priority>
    </url>
Run Code Online (Sandbox Code Playgroud)

我尝试过使用SimpleXML:

curl_setopt($ch, CURLOPT_URL, 'http://onlineservices.letterpart.com/sitemap.xml;jsessionid=1j1agloz5ke7l?id=1j1agloz5ke7l');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);

$xml …
Run Code Online (Sandbox Code Playgroud)

php curl simplexml

6
推荐指数
2
解决办法
1万
查看次数

无法使用$ | = 1关闭Perl中的缓冲;

我正在写两个文件,一个是使用Log_message函数的日志,另一个是我的file_write函数写入OUT,我想逐行写入而不是缓冲,以便逐行写入而不是一次性写入在脚本的最后.

我已经阅读了有关缓冲和使文件句柄变热的文章,但无法让我的代码工作.

在这个例子中,我$|=1;foreach循环之前添加了它,但它仍然一次写入.我做的事真的很蠢吗?

如果有帮助的话,我已将我的整个脚本进一步缩小.

    #-----------------------------------------------
    sub file_write {
    #-----------------------------------------------
    open OUT, ">>$OUT" or Log_message ("\n$DATE - $TIME - ERROR - Could not create filelist.doc \t");
    Log_message ("\n$DATE - $TIME - INFO - Opened the output file");
    my $total = scalar keys %{ $doc->{ resource } };
    Log_message ("\n$DATE - $TIME - INFO - Found: " . $total . " resources");
    #printf "resources: %s\n", scalar keys %{ $doc->{ resource } }; 

   $|=1;

    #And I have also tried: …
Run Code Online (Sandbox Code Playgroud)

perl

5
推荐指数
2
解决办法
5317
查看次数

XML :: Simple似乎不适用于URL.它是否正确?

我使用以下脚本:

#!/usr/local/bin/perl -wT

use strict;
use warnings;

print "Content-type: text/html\n\n";
print "xml reader";

# use module
use XML::Simple;
use Data::Dumper;

#print Dumper (XML::Simple->new()->XMLin());
Run Code Online (Sandbox Code Playgroud)

它将在我的xml文件中读取,名为xml.xml

如果我现在将xml文件移出我的cgi-bin,请更改其名称并使用以下命令引用它:

#print Dumper (XML::Simple->new()->XMLin("../resource.xml"));
Run Code Online (Sandbox Code Playgroud)

它仍然有效.

如果我现在尝试使用url而不是脚本不返回任何内容:

print Dumper (XML::Simple->new()->XMLin("http://digitalessence.net/resource.xml"));
Run Code Online (Sandbox Code Playgroud)

我已经尝试过使用和不使用http://,没有www和各种不同的方法,但它不会返回任何内容.

我在这里做过傻事还是不加载远程网址?

谢谢.

xml perl xml-simple

1
推荐指数
2
解决办法
2495
查看次数

如何在XSL-FO中匹配&lt;sup&gt; value &lt;/ sup&gt;

我正在使用xsl-fo并尝试在 <sup>

例如,我想使2为上标。

<sup id="FNB-0002"><xref href="#Comp_CLJONLINE_CLJ_2010_04_2/FN-0002">2</xref></sup>

我正在使用以下代码,我认为应该可以。

 <xsl:template match="sup[@id='*']">    
        <fo:inline font-size="24pt" font-weight="bold" text-indent="2em" text-transform="uppercase" >
            <xsl:apply-templates/>
            </fo:inline>
    </xsl:template>
Run Code Online (Sandbox Code Playgroud)

但是我所应用的样式均未得到认可。我开始认为这是因为2位于外部参照中,而xsl-fo则忽略了它。

谁能给我一些指导,以迎合这些风格和风格

谢谢,

xpath xsl-fo

0
推荐指数
1
解决办法
3656
查看次数

标签 统计

perl ×2

curl ×1

php ×1

simplexml ×1

xml ×1

xml-simple ×1

xpath ×1

xsl-fo ×1