2013-04-30 2 views
1

xmlstarlet을 사용하여이 KML 파일에서 '좌표'노드의 내용을 추출하려고합니다.이 XPath 표현식이 xmlstarlet에서 올바른 값을 반환하지 않는 이유는 무엇입니까?

KML 파일은 xmlstarlet 자체를 사용하여 유효성을 검사합니다.

나는이 포함 된 작은 테스트 파일로 내려 깍했습니다 :이 쿼리를 실행

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://earth.google.com/kml/2.2"> 
<Document> 
<Placemark> 
    <name>eurovelo-5 690</name> 
    <Snippet></Snippet> 
    <description><![CDATA[&nbsp;]]></description> 
    <styleUrl>#style390</styleUrl> 
    <LineString> 
     <tessellate>1</tessellate> 
     <coordinates> 
     10.146948,44.790592,97.500000 
     10.146958,44.790562,97.599998 
     10.147018,44.790497,97.699997 
     10.147083,44.790466,97.699997 
     </coordinates> 
    </LineString> 
    </Placemark> 
    </Document> 
</kml> 

하지만 실패

xmlstarlet sel -t -c "//coordinates/text()" test.kml 

이 온라인 경로 도구를 사용하여 올바르게 구문 분석 나타납니다 - http://www.qutoric.com/xslt/analyser/xpathtool.html

여기에 뭔가가 있습니까?

+0

당신이 참조하는 온라인 xpath 도구는 XPath 2.0 도구입니다. 따라서 XML의 기본 네임 스페이스를 인식합니다. xmlstarlet과 같은 XPath 1.0 도구는 기본 네임 스페이스를 인식하지 못하므로 네임 스페이스를 정의해야합니다. 접두사 - 허용 된 대답에 명시된대로 – pgfearo

답변

3

당신은 정의하고 http://earth.google.com/kml/2.2 test.kml에 대한 네임 스페이스 접두사를 사용할 필요가 -이 같은 :

xmlstarlet sel -t -c "//kml:coordinates/text()" -N kml=http://earth.google.com/kml/2.2 test.kml 

XPath의이 기본 네임 스페이스가없는 -의 XPath의 이름이 가정 네임 스페이스 접두사를 지정하지 않는 경우를 null 네임 스페이스에 있어야한다. 따라서 이름이 널 (null)과 다른 네임 스페이스 (이 경우)에있는 노드를 일치 시키려고 할 때 항상 네임 스페이스 접두사를 지정해야합니다.

+0

그건 절대적으로 맞습니다 - 고마워요, 미모! – ssk2