2011-08-10 8 views
2

감안할 때 XML은 :선택 XML을 원시 텍스트

<container> 
    <item> 
     <xmlText> 
      <someTag>   
       <otherTag> 
        Text 
       </otherTag> 
      </someTag> 
     </xmlText> 
    </item> 
<container> 

나는 항목/XMLTEXT에서 모든 텍스트을 선택하고 싶습니다. 이 노드의 모든 내용을 태그 (someTag, otherTag)로 인쇄하고 싶습니다.

XPath를 사용하여이 작업을 처리하는 것을 선호하지만이 작업은 Java 프로그램의 일부이므로 이러한 메커니즘이 있으면 사용할 수도 있습니다.

+0

좋은 질문, +1. 짧고 쉬운 XSLT 솔루션에 대한 내 대답을 참조하십시오. :) –

답변

0

사용 XSLT이에 대한 :

<xsl:stylesheet version="1.0" 
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
<xsl:output omit-xml-declaration="yes" indent="yes"/> 
<xsl:strip-space elements="*"/> 

<xsl:template match="/"> 
    <xsl:copy-of select="/container/item/xmlText/node()"/> 
</xsl:template> 
</xsl:stylesheet> 

이가 제공된 XML 문서에 적용됩니다 그것은 그냥 자바에서 XSLT 스타일 시트를 제외한 모든과, Dimitre의 솔루션과 동일합니다 (잘 형성되는 수정!) : 원하는, 올바른 다시

<container> 
    <item> 
     <xmlText> 
      <someTag> 
       <otherTag> 
       Text 
       </otherTag> 
      </someTag> 
     </xmlText> 
    </item> 
</container> 

sult가 생성됩니다 :

<someTag> 
    <otherTag> 
       Text 
       </otherTag> 
</someTag> 
0

이가 당신의 요소가

XPathFactory factory = XPathFactory.newInstance(); 
XPath xpath = factory.newXPath(); 

Element element = (Element) xpath.evaluate(
    "/container/item/xmlText", document, XPathConstants.NODE); 

다음 XPath를 함께 검색 할 때, 당신은이 라인을 따라 뭔가를 할 수 :이보다 간결 것

java.io.ByteArrayOutputStream data = 
    new java.io.ByteArrayOutputStream(); 
java.io.PrintStream ps = new java.io.PrintStream(data); 

// These classes are part of Xerces. But you will find them in your JDK, 
// as well, in a different package. Use any encoding here: 
org.apache.xml.serialize.OutputFormat of = 
    new org.apache.xml.serialize.OutputFormat("XML", "ISO-8859-1", true); 
org.apache.xml.serialize.XMLSerializer serializer = 
    new org.apache.xml.serialize.XMLSerializer(ps, of); 

// Here, serialize the element that you obtained using your XPath expression. 
serializer.asDOMSerializer(); 
serializer.serialize(element); 

// The output stream now holds serialized XML data, including tags/attributes... 
return data.toString(); 

UPDATE, 오히려 Xerces 내부를 사용하는 것보다.

ByteArrayOutputStream out = new ByteArrayOutputStream(); 
Transformer transformer = TransformerFactory.newInstance().newTransformer(); 
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); 
Source source = new DOMSource(element); 
Result target = new StreamResult(out); 
transformer.transform(source, target); 

return out.toString(); 
+0

이것은 depracated 메소드와 클래스를 많이 표시합니다. 더 좋은 방법이 아닙니까? –

+0

더 이상 사용되지 않는 기능은 무엇입니까? Xerces 2.7.1 (최신 버전이 아님) 및 Java 6에서는 여기에 더 이상 지원되지 않습니다. –

+0

이 클래스는 내 인스턴스에서 사용되지 않습니다 : import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.XMLSerializer; –

관련 문제