php - 使用 SimpleXMLparser php 解析带有 namespace 的 xml

标签 php xml simplexml

我正在尝试解析这样的 XML:

<?xml version="1.0" encoding="UTF-8"?>
<gml:FeatureCollection 
    xmlns:ogc="http://www.opengis.net/ogc" 
    xmlns:gml="http://www.opengis.net/gml"
    xmlns:xlink="http://www.w3.org/1999/xlink" 
    xmlns:wfs="http://www.opengis.net/wfs"
    xmlns:p="http://example.org">
    <gml:featureMember>
        <p:Point>
            <gml:pointProperty>
                <gml:Point srsName="epsg:4258">
                    <gml:pos>-3.84307585 43.46031547</gml:pos>
                </gml:Point>
                <gml:Point srsName="epsg:4258">
                    <gml:pos>-3.84299411 43.46018513</gml:pos>
                </gml:Point>
                <gml:Point srsName="epsg:4258">
                    <gml:pos>-3.84299935 43.45998723</gml:pos>
                </gml:Point>
                <!-- 
                    ... many more <gml:Point> nodes ...
                --> 
                <gml:Point srsName="epsg:4258">
                    <gml:pos>-3.84309913 43.46054546</gml:pos>
                </gml:Point>
                <gml:Point srsName="epsg:4258">
                    <gml:pos>-3.84307585 43.46031547</gml:pos>
                </gml:Point>
            </gml:pointProperty>
        </p:Point>
    </gml:featureMember>
</gml:FeatureCollection>

我想要将每个 gml:pos 行保存到数据库中,但目前我很高兴在 webpace 中打印它们(echo...)

$output = simplexml_load_string($output);
$xml = $output->getNamespaces(true); 
//print_r( $xml);
$xml_document = $output->children($xml["p"]);
foreach($xml_document->Point->children($xml["gml"]);
    echo $xml_point->Point[0];
echo $xml->FeatureCollection; 
}

$output中,我有完整的xml,gml:point中的大量坐标

但是我试图使用命名空间来达到目的,但我必须做一些错误的事情,因为除了数组单词之外我无法打印任何内容(即使使用 print_r...)

最佳答案

您不应该从文档中读取命名空间。命名空间是定义标记所属的 XML 语义的唯一字符串。您的 XML 就是一个很好的示例,因为它在两个不同的命名空间中具有 Point 元素。

p:Point 是 { http://example.org }:观点 gml:Point 是 { http://www.opengis.net/gml }:点

pgml 等命名空间前缀是别名,可以使文档更小、更易读。它们仅对元素及其子元素有效。它们可以随时重新定义。更重要的是它们仅对文档有效。

因此,要读取 XML,您需要为命名空间定义自己的前缀,并将它们与 Xpath 一起使用,或者使用 DOM 方法的命名空间感知变体,例如 getAttributeNS()。 Xpath 显然是更优雅的解决方案。您可以使用文档中的前缀或不同的前缀。

$element = simplexml_load_string($content);
$element->registerXPathNamespace('gml', 'http://www.opengis.net/gml');
$element->registerXPathNamespace('p', 'http://example.org');

$result = [];
$positions = $element->xpath('//p:Point[1]//gml:pos');
foreach ($positions as $pos) {
  $result[] = (string)$pos;
}

var_dump($result);

输出:https://eval.in/159739

array(5) {
  [0]=>
  string(23) "-3.84307585 43.46031547"
  [1]=>
  string(23) "-3.84299411 43.46018513"
  [2]=>
  string(23) "-3.84299935 43.45998723"
  [3]=>
  string(23) "-3.84309913 43.46054546"
  [4]=>
  string(23) "-3.84307585 43.46031547"
}

关于php - 使用 SimpleXMLparser php 解析带有 namespace 的 xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24100159/

相关文章:

php - 不同服务器上相同数据的 SimpleXML 差异

php - 仅查询与特定子字符串匹配的记录 - Laravel 5

java - 代码在第二个 xml 文件中不起作用

android - 从 http 服务器检索 xml 流 - android 问题

iphone - 如果标签名称未知,如何在iPhone中以nsdictionary格式转换xml文件

PHP - SimpleXML 故障排除中子节点中的命名空间转换

php - 使用 SimpleXML 创建 WS-Security header ?

php - laravel 5.4中使用ajax调用文件上传

php - mysql max 从 phpmyadmin 工作,但从 php 脚本给我一个错误的值?

php - Laravel:Redirect::to和redirect()有什么区别?