在PHP中使用命名空间解析XML

时间:2012-08-03 14:39:48

标签: php xml xml-parsing simplexml

我搜索过高低,我找不到直接回答我的情况。我有以下XML:

<Tims xmlns="http://my.url.com/namespace" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xlink="http://www.w3.org/1999/xlink" xsi:schemaLocation="http://my.url.com/namespace http://my.url.com/xsd/Tims.xsd">
<Database xlink:href="http://my.url.com/xml/performance/database.svc">
    <ProjectID xlink:href="http://my.url.com/xml/Tvq11p/project.svc" title="Title1">Tvq11p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq10p/project.svc" title="Title2">Tvq10p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq8p/project.svc" title="Title3">Tvq8p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq9p/project.svc" title="Title4">Tvq9p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq5p/project.svc" title="Title5">Tvq5p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq15p/project.svc" title="Title6">Tvq15p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq2p/project.svc" title="Title7>Tvq2p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq3p/project.svc" title="Title8">Tvq3p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq12p/project.svc" title="Title9">Tvq12p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq13p/project.svc" title="Title10">Tvq13p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq14p/project.svc" title="Title11">Tvq14p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq1p/project.svc" title="Title12">Tvq1p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq4p/project.svc" title="Title13">Tvq4p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq6p/project.svc" title="Title14">Tvq6p</ProjectID>
    <ProjectID xlink:href="http://my.url.com/xml/Tvq7p/project.svc" title="Title15">Tvq7p</ProjectID>
</Database>
<Timestamp>2012-08-03T09:47:06-04:00</Timestamp>
<ExecutionTime>0.01</ExecutionTime>
</Tims>

我想要做的就是提取每个ProjectID节点的属性和值..

我尝试过DOM,SimpleXML和XMLParser。这完全是在PHP中,但是,我实际上对其他语言开放,只要它们可以从Unix命令行执行。

谢谢!

更新 我尝试过的: 当我尝试失败时,我大多删除了我的尝试。我的最新迭代是这样的:

$return = send_request($requestUri, TIMS_REQUEST_TIMEOUT); // returns SimpleXMLElement
$return->registerXPathNamespace('e', 'http://www.webex.com/schemas/2002/06/service/event');
foreach($return->xpath('//ProjectID') as $project) {
    $project->registerXPathNamespace('xlink', 'http://www.w3.org/1999/xlink');
    print_r($project);
}

我的print_r永远不会开火。

1 个答案:

答案 0 :(得分:1)

您不需要将XPath用于这种简单的XML架构。试试这个:

foreach( $xml->Database->ProjectID as $el) {
    $attributes = $el->attributes( 'xlink', true);
    echo $attributes['href'] . ' ' . $el . "\n";
}

这将循环所有ProjectID个节点并获取href属性并打印节点的内容。修复title="Title7属性中的缺失引号后,此worked for me