我正在使用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之外,但我留下了必要的部分。如果我把所有东西都留下来,这将是一个更大的文件。
答案 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?