2013-05-31 5 views
1

자바로 시작한 첫날이고 내 웹 사이트 용으로 약간의 xml 파서를 만들려고합니다. 따라서 내 sitemaps.xml을 깨끗하게 처리 할 수 ​​있습니다. 코드 패스자바 jdom xml 구문 분석

System.out.println(xml); 

내가 XML 사이트 맵의 깨끗한 인쇄를 얻을 때 내가 사용하는 코드는

import java.io.IOException; 
import java.io.InputStream; 
import java.io.StringReader; 
import java.net.URL; 
import java.util.List; 


import org.jdom2.Element; 
import org.jdom2.JDOMException; 
import org.jdom2.input.SAXBuilder; 

class downloadxml { 
    public static void main(String[] args) throws IOException { 

     String str = "http://www.someurl.info/sitemap.xml"; 
     URL url = new URL(str); 
     InputStream is = url.openStream(); 
     int ptr = 0; 
     StringBuilder builder = new StringBuilder(); 
     while ((ptr = is.read()) != -1) { 
      builder.append((char) ptr); 
     } 
     String xml = builder.toString(); 

     org.jdom2.input.SAXBuilder saxBuilder = new SAXBuilder(); 
     try { 
      org.jdom2.Document doc = saxBuilder.build(new StringReader(xml)); 
      System.out.println(xml); 
      Element xmlfile = doc.getRootElement(); 
      System.out.println("ROOT -->"+xmlfile); 
      List list = xmlfile.getChildren("url"); 
      System.out.println("LIST -->"+list); 
     } catch (JDOMException e) { 
      // handle JDOMExceptio n 
     } catch (IOException e) { 
      // handle IOException 
     } 

     System.out.println("==========================="); 

    } 
} 

같다. 그것이 올 때 :

System.out.println("ROOT -->"+xmlfile); 

출력 :

ROOT -->[Element: <urlset [Namespace: http://www.sitemaps.org/schemas/sitemap/0.9]/>] 

또한 루트 요소를 찾습니다. 그러나 스크립트가 차일 가야 일부 또는 다른 이유에 대해, 그것은 빈 인쇄를 반환 :

System.out.println("LIST -->"+list); 

출력 :

LIST -->[] 

내가 다른 방법으로 무엇을해야합니까? 차일드를 가져 오기위한 포인터가 있습니까?

XML은이

<?xml version="1.0" encoding="UTF-8"?> 
      <urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" 
      xmlns:image="http://www.google.com/schemas/sitemap-image/1.1"> 
       <url> 
        <loc>http://www.image.url</loc> 
        <image:image> 
        <image:loc>http://www.image.url/image.jpg</image:loc> 
        </image:image> 
        <changefreq>daily</changefreq> 
       </url> 
       <url> 
      </urlset> 

답변

2

처럼 당신은 하루에 먼 길을 왔어요 보인다.

간단히 대답하면 XML 문서의 네임 스페이스를 무시하는 것입니다. 당신은 또한에 전체 빌드 프로세스를 단순화 할 수 있습니다,

List list = xmlfile.getChildren("url"); 

Namespace ns = Namespace.getNamespace("http://www.sitemaps.org/schemas/sitemap/0.9"); 
List list = xmlfile.getChildren("url", ns); 
여러분의 편의를 위해

에 : 줄을 변경

org.jdom2.Document doc = saxBuilder.build("http://www.someurl.info/sitemap.xml"); 
+0

감사합니다. 또한 두 번째 조언은 매우 좋았습니다! – Johnny000

+1

환영합니다. 네임 스페이스 및 JDOM에서 처리하는 방법에 대한 자세한 내용은 http://www.jdom.org/docs/faq.html#a0260을 참조하십시오. – rolfl

1

내 의견이 위의 비슷합니다, 하지만 catch 절을 사용하면 입력 XML이 "올바른 형식"이 아닌 경우 좋은 메시지가 표시됩니다. 입력은 xml 파일입니다.

File file = new File("adr781.xml"); 
SAXBuilder builder = new SAXBuilder(false); 
    try { 
     Document doc = builder.build(file); 
     Element root = doc.getRootElement(); 
    } catch (JDOMException e) { 
     say(file.getName() + " is not well-formed."); 
     say(e.getMessage()); 
    } catch (IOException e) { 
     say("Could not check " + file.getAbsolutePath()); 
     say(" because " + e.getMessage()); 
    }