2012-06-26 5 views
1

현재 Java 및 XPath를 사용하여 팟 캐스트 피드에서 일부 정보를 얻으려면 XPath를 사용하고 있습니다. 나는 노드의 속성을 읽으려고 해요 : 이미지 > :XPath를 사용하여 XML에서 Java의 속성 값 가져 오기

<?xml version="1.0" encoding="UTF-8"?> 
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:atom="http://www.w3.org/2005/Atom/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" version="2.0"> 
    <channel> 
    [....] 
    <itunes:image href="http://icebox.5by5.tv/images/broadcasts/14/cover.jpg" /> 
[...] 

내가 < iTunes에서 href의 속성의 값을 취득합니다. 현재, 나는 다음과 같은 코드를 사용하고 있습니다 :

private static String IMAGE_XPATH = "//channel/itunes:image/@href"; 
String imageUrl = xpath.compile(IMAGE_XPATH).evaluate(doc, XPathConstants.STRING).toString(); 

이미지 URL의 결과는 입니다. 코드에서 어떻게됩니까? XPath 코드 또는 Java 코드에 오류가 있습니까?

감사합니다. :)

답변

4

안 네임 스페이스 awarness :

DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); 
xmlFact.setNamespaceAware(false); 

귀하의 XPath 식 이제 다음과 같아야합니다

"//channel/image/@href" 

을 그냥 NameSpaceContext 자신을 구현, 이름 공간을 인식로 사용해야하는 경우처럼 보일 것입니다 이 :

NamespaceContext ctx = new ItunesNamespaceContext(); 

XPathFactory xpathFact = XPathFactory.newInstance(); 
XPath xpath = xpathFact.newXPath(); 
xpath.setNamespaceContext(ctx); 
String IMAGE_XPATH = "//channel/itunes:image/@href"; 
String imageUrl = path.compile(IMAGE_XPATH).evaluate(doc,XPathConstants.STRING).toString(); 

편집 : 여기 테스트 코드가 있습니다. 내 지점을 보이는 군 :

String a ="<?xml version=\"1.0\" encoding=\"UTF-8\"?><rss xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:sy=\"http://purl.org/rss/1.0/modules/syndication/\" xmlns:admin=\"http://webns.net/mvcb/\" xmlns:atom=\"http://www.w3.org/2005/Atom/\" xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\" xmlns:content=\"http://purl.org/rss/1.0/modules/content/\" xmlns:itunes=\"http://www.itunes.com/dtds/podcast-1.0.dtd\" version=\"2.0\"><channel><itunes:image href=\"http://icebox.5by5.tv/images/broadcasts/14/cover.jpg\" /></channel></rss>"; 
DocumentBuilderFactory xmlFact = DocumentBuilderFactory.newInstance(); 
xmlFact.setNamespaceAware(false); 
DocumentBuilder builder = xmlFact.newDocumentBuilder(); 
XPathFactory xpathFactory = XPathFactory.newInstance(); 
String expr = "//channel/image/@href"; 
XPath xpath = xpathFactory.newXPath(); 
Document doc = builder.parse(new InputSource(new StringReader(a))); 
String imageUrl = (String) xpath.compile(expr).evaluate(doc ,XPathConstants.STRING); 
System.out.println(imageUrl); 

출력은 다음과 같습니다

http://icebox.5by5.tv/images/broadcasts/14/cover.jpg 
+0

안녕하세요. 네임 스페이스가 문제라고 생각하지 않습니다. 이미 다른 XPath 표현식을 사용하여 itunes : 태그를 얻고 있습니다. – Francesc

+1

방금이 답변이 옳다는 것을 증명하는 코드를 추가했습니다. jspboix

0

XPath에는 루트 요소가 포함되어야하므로 rss/channel/itunes : image/@ href.

또는 xpath를 시작하여 모든 레벨에서 xpath (// channel/itunes : image/@ href)를 검색 할 수 있지만 루트가 항상 동일하면 더 효율적입니다. 첫 번째 옵션을 사용하십시오.

+0

안녕하세요. 귀하의 코드를 사용하기 위해 XPath를 변경해 보았지만 여전히 null을 리턴합니다. – Francesc

+0

XPath가 전체 속성을 리턴 할 수 있습니까? 즉, DOM의 해당 부분을 포함하는 오브젝트로서 전체 값을 리턴 할 수 있습니까? – Francesc

관련 문제