0

如何使用这种结构解析 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>
...

如何获得版本?和大小?甚至获得每个 SDK 平台(sdk:平台)的生成日期?(在 2009 年 10 月 22 日星期四 10:16:34 PDT 使用 eclair-sdk 17704:Platform.Addon.Tools.Doc.)

非常非常TNX

4

1 回答 1

1

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

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

我们知道我们想要命名空间,并且我们知道我们想要哪一个,因为我们感兴趣的每个节点都以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/7. 这7是一个版本号,因此如果您需要更新以使用不同的 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 中的输出非常特定,因此您可能需要将其调整为更加动态,您可以使用 PHPpreg_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];

输出:

2009 年 10 月 22 日星期四 10:16:34 PDT

于 2013-06-05T11:02:56.830 回答