2010-03-26 2 views
5

TASK : xml 네임 스페이스와 xml 스키마를 사용하는 기존 XML 문서 (UTF-8)가 있습니다. 특정 요소를 구문 분석하고이 요소에 XML 네임 스페이스 접두사를 사용해야하는 내용을 추가 한 다음 문서를 다시 써야합니다.기존 xml 문서를 조작/편집하는 데 가장 적합한 Java Xml 파서

이 작업에 사용해야하는 최상의 XML 파서 라이브러리는 무엇입니까?

이전 스레드 (Best XML parser for Java)를 보았지만 dom4j 또는 JDOM이 네임 스페이스/xmlSchema에 적합하고 UTF-8 문자를 제대로 지원하는지 확실하지 않았습니다.
JDOM
DOM4J 한 최고
XOM
우드 스탁

어떤 생각에 대한 작업처럼 보인다

일부 파서? :-) 나는 JDK 6을 사용하며 너무 많은 코드를 작성해야하기 때문에 내장 SAX/DOM 기능을 사용하지 않는 편이 좋다.

이러한 작업을 수행하는 데 도움이 될만한 몇 가지 예가 있습니다.

+0

방법으로 것을하고있는 것을 해결할 수있는 내장 DOM 시설이 너무 많은 코드를하는 것? 아, 맞아 - 자바 ... ;-)하지만 진지하게 : 15-20 라인이 너의 의견에 너무 많은 코드인가? 그렇다면 무엇이 받아 들여질 수 있을까요? – Thomas

+0

중부 하 작업을위한 최상의 XML 처리 라이브러리는 vtd-xml, bar none입니다. http://sdiwc.us/digitlib/journal_paper.php?paper=00000582.pdf –

답변

5

, JDOM을 사용 InputStream를 측정하고 그 문서를 만들기 :

InputStream inputStream = (InputStream)httpURLConnection.getContent(); 
DocumentBuilderFactory docbf = DocumentBuilderFactory.newInstance(); 
docbf.setNamespaceAware(true); 
DocumentBuilder docbuilder = docbf.newDocumentBuilder(); 
Document document = docbuilder.parse(inputStream, baseUrl); 

을 그 시점에서, 당신은 자바 객체에서 XML이있다. 끝난. 쉬운.

문서 객체와 Java API를 사용하여 살펴 보거나 XPath를 쉽게 사용할 수 있습니다 (일단 배웠 으면).

public static XPath buildXPath() { 
    XPathFactory factory = XPathFactory.newInstance(); 
    XPath xpath = factory.newXPath(); 
    xpath.setNamespaceContext(new AtomNamespaceContext()); 
    return xpath; 
} 


public class AtomNamespaceContext implements NamespaceContext { 

    public String getNamespaceURI(String prefix) { 
     if (prefix == null) 
      throw new NullPointerException("Null prefix"); 
     else if ("a".equals(prefix)) 
      return "http://www.w3.org/2005/Atom"; 
     else if ("app".equals(prefix)) 
      return "http://www.w3.org/2007/app"; 
     else if ("os".equals(prefix)) 
      return "http://a9.com/-/spec/opensearch/1.1/"; 
     else if ("x".equals(prefix)) 
      return "http://www.w3.org/1999/xhtml"; 
     else if ("xml".equals(prefix)) 
      return XMLConstants.XML_NS_URI; 
     return XMLConstants.NULL_NS_URI; 
    } 

    // This method isn't necessary for XPath processing. 
    public String getPrefix(String uri) { 
     throw new UnsupportedOperationException(); 
    } 

    // This method isn't necessary for XPath processing either. 
    public Iterator getPrefixes(String uri) { 
     throw new UnsupportedOperationException(); 
    } 
} 
이 가

가 그럼 그냥 사용, (고맙게도) 모두 많은 시간이 걸릴하지 않습니다 : 너무 많이 쓰기 때문에

return Integer.parseInt(xpath.evaluate("/a:feed/os:totalResults/text()", document)); 
+0

+1 - JDOM은 배우기에 가장 쉬운 API입니다 이것 때문에. XSLT는 이와 같은 작업을 자주하는 경우 더 나은 선택이 될 것입니다. – jsight

5

XSLT를 사용하십시오. 진지하게. 이것은 그것을위한 완벽한 직업입니다. 복사 템플릿을 사용하여 XML을 더 추가해야하는 곳을 제외한 모든 내용을 복사합니다. DOM 조작 대신 실제로 XML을 작성하여 XML을 추가 할 수도 있습니다.

은 복사 템플릿입니다 :

<xsl:template match="node() | @*"> 
    <xsl:copy> 
     <xsl:apply-templates select="@* | node()"/> 
    </xsl:copy> 
</xsl:template> 

나는 많은 사람들이 XSLT를 싫어 알고 있지만, 이것은 정말 빛과 거의 코드를 걸릴 작업이다. 또한, JDK에있는 것을 사용할 수 있습니다.

1

원하는 것을하기 위해 xslt 스타일 시트를 작성할 수있는 것처럼 들립니다.

2

조금 소요하는 XPath 객체를 구축 코드는 고려하는 것이 좋습니다, jOOX 당신을위한 주요 문제 :

http://code.google.com/p/joox/

jQuery에서 Java 로의 포트가되도록 jOOX를 만들었습니다. 기본 기술은 Java의 표준 DOM입니다.일부 샘플 코드 :

// Find the order at index for and add an element "paid" 
$(document).find("orders").children().eq(4) 
      .append("<paid>true</paid>"); 

// Find those orders that are paid and flag them as "settled" 
$(document).find("orders").children().find("paid") 
      .after("<settled>true</settled>"); 

// Add a complex element 
$(document).find("orders").append(
    $("order", $("date", "2011-08-14"), 
      $("amount", "155"), 
      $("paid", "false"), 
      $("settled", "false")).attr("id", "13"); 

참고 : 네임 스페이스가 아직 명시 적으로 지원되지 않습니다,하지만 당신은

+0

jOOX는 좋은 아이디어입니다. 그러나이 기술은 속성을 사용하여 조작 할 수 없기 때문에 시간을 잃었습니다. 이 기술이 없으면이 기술은 독서에만 적합합니다. – wojand

+0

@ wojand : 왜 이렇게 생각하니? jOOX는 속성을 조작 할 수 있습니다. 내 대답에있는 세 번째 예제를 보라.'id = "13"' –

+0

어떻게 기존 태그에 속성을 추가 할 수 있는지 보여라. 태그를 추가 할 수는 있지만 기존 태그에 속성을 추가해야하는 경우에 문제가 있습니다. 나는 간단한 해결책을 찾을 수 없었다. 이 문제에 대한 jOOX 페이지의 예제를 찾지 못했습니다. 위 예제에서 속성을 가진 태그를 추가하지만, 태그가없는 $ {}에 하나의 속성 만 추가하는 방법은 무엇입니까? – wojand