PHP-Parsing Android sdk-repository XML


PHP-Parsing Android sdk-repository XML

如何用这个结构解析XML:

<sdk:sdk-repository xmlns:sdk="http://schemas.android.com/sdk/android/repository/7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<!--
 Generated on Thu Oct 22 10:16:34 PDT 2009 using eclair-sdk 17704: Platform. Addon. Tools. Doc. 
-->
    <sdk:platform>
<sdk:version>2.0</sdk:version>
<sdk:api-level>5</sdk:api-level>
<sdk:codename/>
<sdk:revision>01</sdk:revision>
<sdk:min-tools-rev>
<sdk:major>3</sdk:major>
</sdk:min-tools-rev>
<sdk:description>Android SDK Platform 2.0, revision 1</sdk:description>
<sdk:desc-url>http://developer.android.com/sdk/android-2.0.html</sdk:desc-url>
<sdk:obsolete/>
<sdk:archives>
<sdk:archive arch="any" os="linux">
<sdk:size>75095268</sdk:size>
<sdk:checksum type="sha1">be9be6a99ca32875c96ec7f91160ca9fce7e3c7d</sdk:checksum>
<sdk:url>android-2.0_r01-linux.zip</sdk:url>
</sdk:archive>
<sdk:archive arch="any" os="macosx">
<sdk:size>74956356</sdk:size>
<sdk:checksum type="sha1">2a866d0870dbba18e0503cd41e5fae988a21b314</sdk:checksum>
<sdk:url>android-2.0_r01-macosx.zip</sdk:url>
</sdk:archive>
<sdk:archive arch="any" os="windows">
<sdk:size>76288040</sdk:size>
<sdk:checksum type="sha1">aeb623217ff88b87216d6eb7dbc846ed53f68f57</sdk:checksum>
<sdk:url>android-2.0_r01-windows.zip</sdk:url>
</sdk:archive>
</sdk:archives>
<sdk:layoutlib>
<sdk:api>4</sdk:api>
</sdk:layoutlib>
<sdk:uses-license ref="android-sdk-license"/>
</sdk:platform>
...

如何获得版本?大小和 ?甚至得到生成日期(星期四Oct 22 10:16:34 PDT 2009使用eclair-sdk 17704:平台。插件。工具。医生)。每个SDK平台(SDK: Platform)

very very TNX

解析XML和解析文件中的注释是完全不同的两件事。

关于XML本身,您可以使用PHP的SimpleXml来解析它,但是您必须记住在访问子元素时指定名称空间。

我们知道我们需要名称空间,并且我们知道我们需要哪一个,因为我们感兴趣的每个节点都以something:为前缀。例如:

<sdk:version>2.0</sdk:version>

因此,在本例中,我们对sdk名称空间感兴趣。您可以在最上面的声明节点中找到定义名称空间的位置:

<sdk:sdk-repository xmlns:sdk="http://schemas.android.com/sdk/android/repository/7" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

声明sdk命名空间为http://schemas.android.com/sdk/android/repository/77是一个版本号,所以如果你需要更新以使用不同的sdk,请记住这一点。

使用示例XML解析XML的一个小示例是:
// load the file and create the XML element
$feed = file_get_contents("repository.xml");
$xml = new SimpleXmlElement($feed);
// define the namespace you need to use (we want xmlns:sdk)
$sdk = $xml->children("http://schemas.android.com/sdk/android/repository/7");
// get the "platform" root element and start using it's nodes
$platform = $sdk->platform;
echo 'Version: ' . $platform->version . "<br />";
echo 'Description: ' . $platform->description . "<br />";
foreach ($platform->archives->archive as $archive) {
    echo 'Archive: ' . $archive->url . ", size: " . $archive->size . "<br />";
}

要匹配Generated on ...行,您需要使用子字符串解析构建一个可以解析它的正则表达式。我选择后一种方法来节省代码行,但这完全取决于您自己的选择。

如果您想使用正则表达式,并且这是非常特定于示例XML中的输出,因此您可能需要将其调整为更动态,您可以使用PHP的preg_match和一个非常详细的模式:

$pattern = '/<!--['r'n's]*Generated on (.*) using eclair-sdk 17704: Platform'. Addon'. Tools'. Doc'.['r'n's]*-->/';
$comments = array();
preg_match($pattern, $feed, $comments);
echo $comments[1];
输出:

星期四Oct 22 10:16:34 PDT 2009