2014-11-25 6 views
1

구문 분석하려는 Gmail 계정에서 일부 XML 데이터를 가져오고 있습니다. 를 Ths XML 데이터는 다음과 같습니다xmllint 및 xpath는 https://mail.google.com/mail/feed/atom에서 xml 데이터를 구문 분석합니다.

<?xml version="1.0" encoding="UTF-8"?> 
<feed xmlns="http://purl.org/atom/ns#" version="0.3"> 
    <title>Gmail - Inbox for @gmail.com</title> 
    <tagline>New messages in your Gmail Inbox</tagline> 
    <fullcount>54</fullcount> 
    <link rel="alternate" href="http://mail.google.com/mail" type="text/html"/> 
    <modified>2014-11-25T04:40:04Z</modified> 
    <entry> 
    <title>test</title> 
    <summary/> 
    ... 
</feed> 

내가 같은 모든 항목의 모든 타이틀을 얻기 위해 호핑했다 : 이제

xmllint --xpath '//feed/entry/title' myfile.xml 

, 나는이 있다면이 일 것을 발견 이것은 xmlns 정보가 아닙니다. 는 그러나 XMLNS 정보와 함께, 내가 메시지를 얻을

의 XPath 세트는

I합니다 (XMLNS 부분을 제거) 파일을 수정하지 않고,이 파일을 구문 분석하는 간단한 oneliner 싶습니다 비어 있습니다.

-> 편집 : 에코 "setns X = http://purl.org/atom/ns# \ nxpath/X : 피드/X : 항목/X : 제목/텍스트()"

+0

[xmllint가 xpath를 사용하여 제대로 쿼리하지 못했습니다] 중복 가능성이 있습니다. (http://stackoverflow.com/questions/8264134/xmllint-failing-to-properly-query-with-xpath) –

답변

1

을 깨는 당신이 아마 알고있는 곳 알게 있도록, 위의 같은

xmllint --shell filename 

xpath '//feed/entry/' 

디버그 수준에 의해 노드 수준에 횡단 : xmllint가의 쉘에서 같은 디버깅 시도 입력 XML은 기본 네임 스페이스에 있습니다. 원래 XPath 표현식 :

xmllint --xpath '//feed/entry/title' myfile.xml 

은 네임 스페이스에있는 요소를 찾지 못합니다. 이것이 XPath 결과 집합이 비어있는 이유입니다. 네임 스페이스를 등록하거나 선언 절대적으로 꺼리는 경우

는 다음과 같은 표현은 작동 : 사용자의 입력 XML이 앞에 둔 네임 스페이스가 포함 된 경우

xmllint --xpath "//*[name() = 'feed']/*[name() = 'entry']/*[name() = 'title']" myfile.xml 

, 당신은 local-name() 대신 name() 사용해야 할 것입니다.


아닌 "단순 oneliner"이고, 쉘 모드를 사용 xmllint가 접두사와 함께 공간을 등록하고 XPath 표현으로 사용하는 대안. 자세한 내용은 this answer을 참조하십시오. 그것은 문제를 해결하는 적절한 방법입니다.

+0

위대한, onliner 완벽하게 작동합니다. 왜 쉘을 사용하는 것이 "적절한 방법"이 될까요? – Jonybegood

+0

@ Jonybegood 적절한 방법 인 셸을 사용하지 않고 XML 문서의 네임 스페이스를 무시하는 것이 아니라 올바른 방법입니다. xmllint는 쉘 모드에서만 가능합니다. 우연의 일치입니다. –

+0

감사합니다. 완벽한 의미입니다. 원래의 게시물을 편집하여 적절한 oneliner 솔루션을 포함 시켰습니다. – Jonybegood

0

@Mathias 덕분에, 적절한 onliner처럼 보이는 당신이

+0

매우 유용한 답변이 아닙니다. 문제는 명백하며, 요소는 네임 스페이스에 있습니다. 디버깅 할 필요가 없습니다. –

+0

@ MathiasMüller 그는 위의 코드 샘플에서 xml이 불완전한 것을보고 디버그 할 수 있습니다. –

+0

오류가 문서 형식이 올바른 XML이 아니기 때문에 발생했다면, 결과는'XPath set is empty'가 아닐 것입니다. 그래서 우리는 XML이 "완전"하다는 것을 압니다. 또한 쉘 모드에서는 작은 따옴표로 표현식을 사용하지 않아야합니다. 그렇지 않으면 경로 표현식이 평가되지 않습니다. 마지막으로, 디버깅은 정확한 결과만을 알려주며 결과 집합에는 노드가 없습니다. –