2014-04-09 4 views
0

저는 simplexml을 kml 문서를 통해 사용하고 있으며 특정 순서로 속성을 검색해야하는 프로젝트에서 작업하고 있습니다. 내가 그렇게 할 수있는 방법이 - 나는 이름 = "우편 번호가"어디 SimpleData 값에 액세스하기를 원한다면in simplexml 직접 속성을 기반으로 필드에 액세스 할 수 있습니까?

나는 이런 식으로 뭔가가 있다면 .... 그래서

<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> 

? 비록이 속성을 기반으로 xpath를 사용하는 방법을 모르겠지만 xpath를 사용할 수는 없기 때문에이 문서에는 MANY가 있습니다.

편집 :

나는 ... 뭔가를 싶어요

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

원하는 효과는 그것이 "우편 번호"의 속성으로 SimpleData 요소의 값을 끌어 것이되고, 그것은 것 각 위치 표시 요소에 대해이 작업을 수행하십시오. 하지만이 코드를 반환 할 수는 없습니다.

XML에서 제외 된 구조가 약간 있지만 필요한 부분을 남겼습니다. 내가 모든 것을 빠뜨리면, 이것은 훨씬 더 큰 문서가 될 것입니다.

편집 편집 : 나는 진정한 문제를 발견했으며, 미래에는 누구에게나 도움이 될 것입니다. KML 또는 XML에 기본 네임 스페이스가있는 경우 "registerXPathNamespace ("c ","namespace here ")"로 네임 스페이스를 정의하고 $ xml-> xpath ('// c : element '); 오류 메시지가 표시되지 않고 그냥 매번 빈 배열을 검색했습니다.

답변

1

왜 이것이 XPath에서는 불가능하다고 생각하는지 알 수 없습니다. 사실, 그것은 XPath에 대한 가장 기본적인 사용 사례 중 하나입니다 : 내가 아는

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

나는 속성에 의해 뭔가를 얻는 정확한 구문을 몰랐다. 나는 또한 text()가 값을 얻기 위해 내장 된 함수라고 가정한다. 직접 액세스 할 수있는 방법이 있습니까? "$ place-> ExtendedData-> SchemaData-> SimpleData [@ name ="ZIPcode "] -> text()"같은 것을 시도하면 "="때문에 오류가 발생합니다. –

+0

@ 존 오클리 오케이, 나는 단지 당신이 이미 당신의 질문에 올바른 @ 문법을 사용했음을 이미 알고 있다고 가정합니다. 또한, XPath를 배우면서 무언가를 Google로 학습하면 가장 먼저 배울 점 중 하나입니다. 그리고 네,'text()'는 요소의 텍스트 값을 추출합니다. 'string()'을 사용하면 프로세서가 주석을 무시할 때 그것을 지원한다면 실제로 더 좋습니다. – dirkk

+0

도움을 주셔서 감사합니다. xpath를 사용한 이후 오랜 시간이 걸렸으므로 메모리에서이 작업을 수행하려고했습니다. 기본 사용법을 확인하고 속성에 의한 xpath 검색을 사용한 php.net에 대한 예제를 보지 못했습니다 (아니면 완전히 놓친 것입니까?). 그 이후로 가능하다고 생각했는데, 데이터에 액세스하는 간단한 방법처럼 보였습니다. –

-1

조금 극단적이지만 grep으로 또는 <SimpleData name="ZIPcode">

이에 포함 된 행을 찾을 수없는 이유 라인 사용 부분 문자열 또는 정규식?

+0

유효한 XML 파일이 있다면 그것은 끔찍한 해결책입니다! 굴착기를 가지고 있다면 왜 삽을 사용해야합니까? – dirkk

+0

@dirkk 화낼 필요가 없습니다. 나는 그것을 극단적으로 지정했고 최후의 수단으로서 그가 명시 적으로 말하기를 ** 나는 xpath **를 사용할 수 없다고 제안했다. 이 경우 여전히 문제는 해결할 수 있지만 해결 방법은 있습니다. – legrass

+0

나는 화가났다 (나는 개인적인 관계에 대한 그 느낌을 보존한다). OP가 XPath (이것은 잘못된 것)로는 불가능한 작업이라고 생각하기 때문에 그는 XPath를 사용할 수 없다고 분명히 말했습니다. grep을 사용하여 XML 내에서 검색하는 것은 좋은 생각이 아닙니다. ''요소 내에 추가 속성이 있으면 솔루션이 이미 실패 할 것입니다. 또한 OP가 이제 각각의 ''안에서 검색하기를 원하기 때문에 실제로 grep을 사용하는 것이 더 어려울 것입니다. – dirkk

관련 문제