2011-08-17 7 views
0

응답이있는 응용 프로그램이 있습니다. 아래 문자열과 같은 일부 데이터가 있습니다.SAX 파서가있는 문자열에서 절의 모든 데이터를 가져 오는 방법은 무엇입니까?

모두 같은 절의 데이터를 모두 원하십니까 & 어떻게받을 수 있습니까?

여기 내 코드입니다.

import java.io.IOException; 
import java.io.StringReader; 

import javax.xml.parsers.DocumentBuilder; 
import javax.xml.parsers.DocumentBuilderFactory; 
import javax.xml.parsers.ParserConfigurationException; 

import org.w3c.dom.CharacterData; 
import org.w3c.dom.Document; 
import org.w3c.dom.Element; 
import org.w3c.dom.Node; 
import org.w3c.dom.NodeList; 
import org.xml.sax.InputSource; 
import org.xml.sax.SAXException; 


public class soaparse { 

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException { 
     String ss = 
     "<![CDATA[<translation>"+ 
    "<clause keyword=\"Alternative\"><en>Alternative</en><alt>Alternative</alt></clause>"+ 
    "<clause keyword=\"Back\"><en>Back</en><alt>Back</alt></clause>"+ 
    "<clause keyword=\"BackgroundImage\"><en>Bg. Image</en><alt>Bg. Image</alt></clause>"+ 
    "<clause keyword=\"ButtonColor\"><en>Button Color</en><alt>Button Color</alt></clause>"+ 
    "<clause keyword=\"ButtonText\"><en>Button Text</en><alt>Button Text</alt></clause>"+ 
    "<clause keyword=\"CategoryId\"><en>Category Id</en><alt>Category Id</alt></clause>"+ 
    "<clause keyword=\"English\"><en>English</en><alt>English</alt></clause>"+ 
    "<clause keyword=\"GsmNo\"><en>Gsm No</en><alt>Gsm No</alt></clause>"+ 
    "<clause keyword=\"GsmNumber\"><en>Gsm Number</en><alt>Gsm Number</alt></clause>"+ 
    "<clause keyword=\"LabelColor\"><en>Label Color</en><alt>Label Color</alt></clause>"+ 
    "<clause keyword=\"Language\"><en>Language</en><alt>Language</alt></clause>"+ 
    "<clause keyword=\"LanguageId\"><en>Lang Id</en><alt>Lang Id</alt></clause>"+ 
    "<clause keyword=\"Password\"><en>Password</en><alt>Password</alt></clause>"+ 
    "<clause keyword=\"PosSetup\"><en>Pos Setup</en><alt>Pos Setup</alt></clause>"+ 
    "<clause keyword=\"Redemption\"><en>Redemption</en><alt>Redemption</alt></clause>"+ 
    "<clause keyword=\"RedemptionSetup\"><en>Redemption Setup</en><alt>Redemption Setup</alt></clause>"+ 
    "<clause keyword=\"Sale\"><en>Sale</en><alt>Sale</alt></clause>"+ 
    "<clause keyword=\"Save\"><en>Save</en><alt>Save</alt></clause>"+ 
    "<clause keyword=\"ServiceUrl\"><en>Service Url</en><alt>Service Url</alt></clause>"+ 
    "<clause keyword=\"Setup\"><en>Setup</en><alt>Setup</alt></clause>"+ 
    "<clause keyword=\"Submit\"><en>Submit</en><alt>Submit</alt></clause>"+ 
    "<clause keyword=\"TerminalId\"><en>Terminal Id</en><alt>Terminal Id</alt></clause>"+ 
    "<clause keyword=\"TransactionId\"><en>Transaction Id</en><alt>Transaction Id</alt></clause>"+ 
    "<clause keyword=\"Void\"><en>Void</en><alt>Void</alt></clause>"+ 
    "<clause keyword=\"Voucher\"><en>Voucher</en><alt>Voucher</alt></clause>"+ 
    "<clause keyword=\"VoucherId\"><en>Voucher Id</en><alt>Voucher Id</alt></clause>"+ 
    " </translation>]]>"; 

     DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); 
      InputSource in = new InputSource(); 
      in.setCharacterStream(new StringReader(ss)); 

      Document doc = db.parse(in); 
      NodeList nodes = doc.getElementsByTagName("GetTranslationResult"); 

     for (int i = 0; i < nodes.getLength(); i++) { 
       Element element = (Element) nodes.item(i); 

       NodeList name = element.getElementsByTagName("en"); 
       Element line = (Element) name.item(i); 
       System.out.println("Name: " + getCharacterDataFromElement(line)); 

       NodeList title = element.getElementsByTagName("alt"); 
       line = (Element) title.item(i); 
       System.out.println("Title: " + getCharacterDataFromElement(line)); 

      } 
    } 

    public static String getCharacterDataFromElement(Element e) { 
      Node child = e.getFirstChild(); 
      if (child instanceof CharacterData) { 
       CharacterData cd = (CharacterData) child; 
       return cd.getData(); 
      } 
      return ""; 
      } 
} 

답변

2

에서 솔루션을 해결하고, 솔루션을 만들어 파서 클래스 및 호출 클래스해야한다.

XML 처리기 클래스

class xmlHandler extends DefaultHandler { 
    private Vector nodes = new Vector(); 
    private Stack tagStack = new Stack(); 

    public void startDocument() throws SAXException { 
    } 

    public void startElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     // System.out.println("1"); 
     if (qName.equals("clause")) { 
      Noden node = new Noden(); 
      nodes.addElement(node); 
      // System.out.println("2"); 
     } 
     // System.out.println("3"); 
     tagStack.push(qName); 
    } 

    public void characters(char[] ch, int start, int length) 
      throws SAXException { 
     String chars = new String(ch, start, length).trim(); 

     if (chars.length() > 0) { 
      String qName = (String) tagStack.peek(); 
      Noden currentnode = (Noden) nodes.lastElement(); 
      // System.out.println(qName); 

      if (qName.equals("en")) { 
       currentnode.setEn(chars); 
      } else if (qName.equals("alt")) { 
       currentnode.setAlt(chars); 
      } 
     } 
    } 

    public void endElement(String uri, String localName, String qName, 
      Attributes attributes) throws SAXException { 
     tagStack.pop(); 
    } 

    public void endDocument() throws SAXException { 
     StringBuffer result = new StringBuffer(); 
     for (int i = 0; i < nodes.size(); i++) { 
      Noden currentnode = (Noden) nodes.elementAt(i); 
      result.append("En : " + currentnode.getEn() + " Alt : " 
        + currentnode.getAlt() + "\n"); 
     } 
     System.out.println(result.toString()); 
    } 

    class Noden { 
     private String en; 
     private String alt; 

     public Noden() { 
     } 

     public void setEn(String en) { 
      this.en = en; 
     } 

     public void setAlt(String alt) { 
      this.alt = alt; 
     } 

     public String getEn() { 
      return en; 
     } 

     public String getAlt() { 
      return alt; 
     } 
    }; 

는 예 예쁘게 나 구문 분석 SAX에 대해 이해하는 데 도움이되는 기능

try 
     { 
      SAXParserFactory factory = SAXParserFactory.newInstance(); 
      SAXParser saxParser = factory.newSAXParser(); 
      InputStream is = null; 

      String xml = "<![CDATA[<translation>"+ 
      "<clause keyword=\"Alternative\"><en>Alternative</en><alt>Alternative</alt></clause>"+ 
      "<clause keyword=\"Back\"><en>Back</en><alt>Back</alt></clause>"+ 
      "<clause keyword=\"BackgroundImage\"><en>Bg. Image</en><alt>Bg. Image</alt></clause>"+ 
      "<clause keyword=\"ButtonColor\"><en>Button Color</en><alt>Button Color</alt></clause>"+ 
      "<clause keyword=\"ButtonText\"><en>Button Text</en><alt>Button Text</alt></clause>"+ 
      "<clause keyword=\"CategoryId\"><en>Category Id</en><alt>Category Id</alt></clause>"+ 
      "<clause keyword=\"English\"><en>English</en><alt>English</alt></clause>"+ 
      "<clause keyword=\"GsmNo\"><en>Gsm No</en><alt>Gsm No</alt></clause>"+ 
      "<clause keyword=\"GsmNumber\"><en>Gsm Number</en><alt>Gsm Number</alt></clause>"+ 
      "<clause keyword=\"LabelColor\"><en>Label Color</en><alt>Label Color</alt></clause>"+ 
      "<clause keyword=\"Language\"><en>Language</en><alt>Language</alt></clause>"+ 
      "<clause keyword=\"LanguageId\"><en>Lang Id</en><alt>Lang Id</alt></clause>"+ 
      "<clause keyword=\"Password\"><en>Password</en><alt>Password</alt></clause>"+ 
      "<clause keyword=\"PosSetup\"><en>Pos Setup</en><alt>Pos Setup</alt></clause>"+ 
     "<clause keyword=\"Redemption\"><en>Redemption</en><alt>Redemption</alt></clause>"+ 
      "<clause keyword=\"RedemptionSetup\"><en>Redemption Setup</en><alt>Redemption Setup</alt></clause>"+ 
      "<clause keyword=\"Sale\"><en>Sale</en><alt>Sale</alt></clause>"+ 
      "<clause keyword=\"Save\"><en>Save</en><alt>Save</alt></clause>"+ 
      "<clause keyword=\"ServiceUrl\"><en>Service Url</en><alt>Service Url</alt></clause>"+ 
      "<clause keyword=\"Setup\"><en>Setup</en><alt>Setup</alt></clause>"+ 
      "<clause keyword=\"Submit\"><en>Submit</en><alt>Submit</alt></clause>"+ 
      "<clause keyword=\"TerminalId\"><en>Terminal Id</en><alt>Terminal Id</alt></clause>"+ 
      "<clause keyword=\"TransactionId\"><en>Transaction Id</en><alt>Transaction Id</alt></clause>"+ 
      "<clause keyword=\"Void\"><en>Void</en><alt>Void</alt></clause>"+ 
      "<clause keyword=\"Voucher\"><en>Voucher</en><alt>Voucher</alt></clause>"+ 
      "<clause keyword=\"VoucherId\"><en>Voucher Id</en><alt>Voucher Id</alt></clause>"+ 
      " </translation>]]>"; 

      String newXml = xml.substring(xml.indexOf("<translation>"), xml.indexOf("]]"));   
      System.out.println(newXml); 
      is = new ByteArrayInputStream(newXml.getBytes()); 
      InputSource inputSource = new InputSource(is); 
      saxParser.parse(inputSource,new xmlHandler()); 
     } 
     catch(Exception ex) { 
      ex.printStackTrace(); 
     } 
2

는 다음과 같은 대답을 읽고 난 당신의 쿼리를 작동 할 수

how-to-parse-xml-using-the-sax-parser

+0

를 호출하지만 내 문자열을 구문 분석하고 싶습니다. – Siten

+0

새로운 org.xml.sax.InputSource (새로운 java.io.StringReader (xmlString))'에서'SAXParser.parse'를 호출 할 수 있습니다.'xmlString'에는 XML이 들어 있습니다. – laz

관련 문제