我正在尝试解析这样的 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 }:点
p
和 gml
等命名空间前缀是别名,可以使文档更小、更易读。它们仅对元素及其子元素有效。它们可以随时重新定义。更重要的是它们仅对文档有效。
因此,要读取 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);
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/