在SimpleXML中,我可以直接访问基于属性的字段吗?

时间:2014-04-09 16:28:35

标签: php xpath simplexml kml

我正在使用SimpleXML浏览kml文档,而我正在开发一个需要按特定顺序检索属性的项目。

如果我有这样的事情:

<Placemark>
<Style><LineStyle><color>ff0000ff</color></LineStyle><PolyStyle><fill>0</fill></PolyStyle></Style>
<ExtendedData><SchemaData schemaUrl="#mizipirs">
    <SimpleData name="ZCTA5CE10">55555</SimpleData>
    <SimpleData name="GEOID10">55555</SimpleData>
    <SimpleData name="CLASSFP10">XX</SimpleData>
    <SimpleData name="MTFCC10">XXXXX</SimpleData>
    <SimpleData name="FUNCSTAT10">X</SimpleData>
    <SimpleData name="ZIPNUMERIC">XXXXX</SimpleData>
    <SimpleData name="ALAND10">XXXX</SimpleData>
    <SimpleData name="AWATER10">XXXX</SimpleData>
    <SimpleData name="INTPTLAT10">XX.XXXX</SimpleData>
    <SimpleData name="INTPTLON10">XX.XXXX</SimpleData>
    <SimpleData name="ZIPcode">XXXXX</SimpleData>
    <SimpleData name="AreaName">XXXXX</SimpleData>
    <SimpleData name="TaxYear">XXXXX</SimpleData>
    <SimpleData name="numreturns">XXX</SimpleData>
    <SimpleData name="numjointre">XXX</SimpleData>
    <SimpleData name="avg_agi">XXX</SimpleData>
</SchemaData></ExtendedData>
  <Polygon><outerBoundaryIs><LinearRing><coordinates>[lots of lat/lng data here removed for everyone's own convenience]</coordinates></LinearRing></outerBoundaryIs></Polygon>
</Placemark>

因此,如果我想访问名称=“ZIPcode”的SimpleData值 - 有没有办法可以做到这一点?我在本文档中有很多<Placemark>,所以我不能使用xpath,尽管我甚至不确定如何根据属性使用Xpath。也许这是一个选择?

修改

我喜欢这样的东西:

if(isset($xml->Document->Folder->Placemark)){
    foreach($xml->Document->Folder->Placemark as $place) {
        $zip = $place->xpath('//SchemaData/SimpleData[@name="ZIPcode"]/text()');
    }
}

期望的效果是它使用“ZIPcode”属性拉取SimpleData元素的值,并且它将为每个Placemark元素执行此操作。但是我无法让这段代码返回任何内容。

有一些结构被遗漏在XML之外,但我留下了必要的部分。如果我把所有东西都留下来,这将是一个更大的文件。

3 个答案:

答案 0 :(得分:1)

我不明白为什么你认为XPath无法做到这一点。实际上,它是XPath最基本的用例之一:

Placemark/ExtendedData/SchemaData/SimpleData[@name="ZIPcode"]/text()

答案 1 :(得分:0)

(代表问题作者发布)

我找到了真正的问题。如果您的KML或XML具有默认的名称空间,则必须使用registerXPathNamespace("c","namespace here")定义该名称空间,并将其用于xpath调用中,例如$xml->xpath('//c:element')

我没有收到任何错误消息,只是每次都检索一个空数组。

答案 2 :(得分:-1)

我知道有点极端,但为什么你不要grep或找到包含<SimpleData name="ZIPcode">

的行

并在此行使用substring或regex?