簡體   English   中英

Java:使用SAX解析xml文件

[英]Java: parse xml file using SAX

我有此XML數據要使用SAX進行解析。 問題是我無法弄清楚如何從中獲取數據。 從中獲得的最重要的信息是我認為是base64的編碼數據(fileContent)。 我需要做的是從中制作一個Excel .xls文件。 我已經嘗試了一些方法,但是只能得到一些字段/節點(例如refNumber,userEmail等)名稱,而不能得到它們的實際值。 我在下面放置了一些代碼片段。 誰能幫我嗎?

謝謝!

class SomeClass {
...
private String currentElement;
...
public Result parseSerializedData(String serializedData) throws SAXException, TransformerConfigurationException, TransformerException
    {
        System.out.println("-------------------");
        System.out.println("Serialized: " + serializedData);
        Source src = new SAXSource(xr, new InputSource(new StringReader(serializedData)));
        Result res = new StreamResult(System.out);
        System.out.println("Res 1:" + res);

        TransformerFactory.newInstance().newTransformer().transform(src, res);
        System.out.println("transform 1:" + res);

        try {
         SAXParserFactory factory = SAXParserFactory.newInstance();
         SAXParser saxParser = factory.newSAXParser();
         saxParser.parse(serializedData, new MyHandler());
          } catch (Exception e) {
             e.printStackTrace();
          }

        System.out.println("The current element is: " + currentElement);
        System.out.println("-------------------");
        return res;
    }

    /*
    * Inner class for the Callback Handlers.
    */
   class MyHandler extends DefaultHandler {
      // Callback to handle element start tag
      @Override
      public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
          System.out.println("qName: " + qName);
         currentElement = qName;
      }

      // Callback to handle element end tag
      @Override
      public void endElement(String uri, String localName, String qName)
            throws SAXException {
         currentElement = "";
      }

      // Callback to handle the character text data inside an element
      @Override
      public void characters(char[] chars, int start, int length) throws SAXException {
        BASE64Decoder decoder = new BASE64Decoder();
          try {
            byte[] decodedBytes = decoder.decodeBuffer(String.valueOf(chars));
              System.out.println("The current element2 is: " + currentElement);
              if (currentElement.equals("fileContent")) {
                System.out.println("\tfileContent:\t" + new String(decodedBytes, start, length));
             }
          } catch (IOException e) {
              e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
          }

      }
   }
}

serializedData是該xml文件的內容

基本上,使用characters方法讀取值。 在您的情況下,您僅打印一個標簽。 if (currentElement.equals("fileContent")) 請遵循以下程序。 這將顯示所有標簽的所有值。 還要注意的另一件事是, characters方法讀取最大2048個字節的卡盤(如果我沒記錯的話),因此最好的方法是使用append稍后處理endElement()方法中的值,如示例所示。 請不要為Base64解碼使用DatatypeConverter 您可以使用自己的解碼器。

import java.io.File;

import javax.xml.bind.DatatypeConverter;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxSample {

    public static void main(String argv[]) {

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

            DefaultHandler handler = new DefaultHandler() {

                StringBuilder value;

                public void startElement(String uri, String localName,
                        String qName, Attributes attributes)
                        throws SAXException {
                    value = new StringBuilder();
                }

                public void endElement(String uri, String localName,
                        String qName) throws SAXException {
                    if ("fileContent".equalsIgnoreCase(qName)) {
                        String decodedValue = new String(DatatypeConverter.parseBase64Binary(value.toString()));
                        System.out.println(qName + " = " + decodedValue);
                    } else {
                        System.out.println(qName + " = " + value);
                    }
                    value = new StringBuilder();
                }

                public void characters(char ch[], int start, int length)
                        throws SAXException {
                    value.append(new String(ch, start, length));
                }

            };

            saxParser.parse(new File("data.xml"), handler);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM