Java Tutorial/XML/XMLStreamReader — различия между версиями

Материал из Java эксперт
Перейти к: навигация, поиск
 
м (1 версия)
 
(нет различий)

Текущая версия на 05:18, 1 июня 2010

Debugging utilities for XmlStreamReader

/*   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *  limitations under the License.
 */
// Revised from xml beans
import javax.xml.stream.XMLStreamReader;
/**
 * debugging utilities for XmlStreamReader
 */
public final class XmlStreamUtils {
  public static String printEvent(XMLStreamReader xmlr) {
    StringBuffer b = new StringBuffer();
    b.append("EVENT:[" + xmlr.getLocation().getLineNumber() + "]["
        + xmlr.getLocation().getColumnNumber() + "] ");
    b.append(getName(xmlr.getEventType()));
    b.append(" [");
    switch (xmlr.getEventType()) {
    case XMLStreamReader.START_ELEMENT:
      b.append("<");
      printName(xmlr, b);
      for (int i = 0; i < xmlr.getNamespaceCount(); i++) {
        b.append(" ");
        String n = xmlr.getNamespacePrefix(i);
        if ("xmlns".equals(n)) {
          b.append("xmlns=\"" + xmlr.getNamespaceURI(i) + "\"");
        } else {
          b.append("xmlns:" + n);
          b.append("=\"");
          b.append(xmlr.getNamespaceURI(i));
          b.append("\"");
        }
      }
      for (int i = 0; i < xmlr.getAttributeCount(); i++) {
        b.append(" ");
        printName(xmlr.getAttributePrefix(i), xmlr.getAttributeNamespace(i), xmlr
            .getAttributeLocalName(i), b);
        b.append("=\"");
        b.append(xmlr.getAttributeValue(i));
        b.append("\"");
      }
      b.append(">");
      break;
    case XMLStreamReader.END_ELEMENT:
      b.append("</");
      printName(xmlr, b);
      for (int i = 0; i < xmlr.getNamespaceCount(); i++) {
        b.append(" ");
        String n = xmlr.getNamespacePrefix(i);
        if ("xmlns".equals(n)) {
          b.append("xmlns=\"" + xmlr.getNamespaceURI(i) + "\"");
        } else {
          b.append("xmlns:" + n);
          b.append("=\"");
          b.append(xmlr.getNamespaceURI(i));
          b.append("\"");
        }
      }
      b.append(">");
      break;
    case XMLStreamReader.SPACE:
    case XMLStreamReader.CHARACTERS:
      // b.append(xmlr.getText());
      int start = xmlr.getTextStart();
      int length = xmlr.getTextLength();
      b.append(new String(xmlr.getTextCharacters(), start, length));
      break;
    case XMLStreamReader.PROCESSING_INSTRUCTION:
      String target = xmlr.getPITarget();
      if (target == null)
        target = "";
      String data = xmlr.getPIData();
      if (data == null)
        data = "";
      b.append("<?");
      b.append(target + " " + data);
      b.append("?>");
      break;
    case XMLStreamReader.CDATA:
      b.append("<![CDATA[");
      if (xmlr.hasText())
        b.append(xmlr.getText());
      b.append("]]&gt;");
      break;
    case XMLStreamReader.ruMENT:
      b.append("<!--");
      if (xmlr.hasText())
        b.append(xmlr.getText());
      b.append("-->");
      break;
    case XMLStreamReader.ENTITY_REFERENCE:
      b.append(xmlr.getLocalName() + "=");
      if (xmlr.hasText())
        b.append("[" + xmlr.getText() + "]");
      break;
    case XMLStreamReader.START_DOCUMENT:
      b.append("<?xml");
      b.append(" version="" + xmlr.getVersion() + """);
      b.append(" encoding="" + xmlr.getCharacterEncodingScheme() + """);
      if (xmlr.isStandalone())
        b.append(" standalone="yes"");
      else
        b.append(" standalone="no"");
      b.append("?>");
      break;
    }
    b.append("]");
    return b.toString();
  }
  private static void printName(String prefix, String uri, String localName, StringBuffer b) {
    if (uri != null && !("".equals(uri)))
      b.append("["" + uri + ""]:");
    if (prefix != null && !("".equals(prefix)))
      b.append(prefix + ":");
    if (localName != null)
      b.append(localName);
  }
  private static void printName(XMLStreamReader xmlr, StringBuffer b) {
    if (xmlr.hasName()) {
      String prefix = xmlr.getPrefix();
      String uri = xmlr.getNamespaceURI();
      String localName = xmlr.getLocalName();
      printName(prefix, uri, localName, b);
    }
  }
  public static String getName(int eventType) {
    switch (eventType) {
    case XMLStreamReader.START_ELEMENT:
      return "START_ELEMENT";
    case XMLStreamReader.END_ELEMENT:
      return "END_ELEMENT";
    case XMLStreamReader.PROCESSING_INSTRUCTION:
      return "PROCESSING_INSTRUCTION";
    case XMLStreamReader.CHARACTERS:
      return "CHARACTERS";
    case XMLStreamReader.SPACE:
      return "SPACE";
    case XMLStreamReader.ruMENT:
      return "COMMENT";
    case XMLStreamReader.START_DOCUMENT:
      return "START_DOCUMENT";
    case XMLStreamReader.END_DOCUMENT:
      return "END_DOCUMENT";
    case XMLStreamReader.ENTITY_REFERENCE:
      return "ENTITY_REFERENCE";
    case XMLStreamReader.ATTRIBUTE:
      return "ATTRIBUTE";
    case XMLStreamReader.DTD:
      return "DTD";
    case XMLStreamReader.CDATA:
      return "CDATA";
    case XMLStreamReader.NAMESPACE:
      return "NAMESPACE";
    }
    return "UNKNOWN_EVENT_TYPE";
  }
  public static int getType(String val) {
    if (val.equals("START_ELEMENT"))
      return XMLStreamReader.START_ELEMENT;
    if (val.equals("SPACE"))
      return XMLStreamReader.SPACE;
    if (val.equals("END_ELEMENT"))
      return XMLStreamReader.END_ELEMENT;
    if (val.equals("PROCESSING_INSTRUCTION"))
      return XMLStreamReader.PROCESSING_INSTRUCTION;
    if (val.equals("CHARACTERS"))
      return XMLStreamReader.CHARACTERS;
    if (val.equals("COMMENT"))
      return XMLStreamReader.ruMENT;
    if (val.equals("START_DOCUMENT"))
      return XMLStreamReader.START_DOCUMENT;
    if (val.equals("END_DOCUMENT"))
      return XMLStreamReader.END_DOCUMENT;
    if (val.equals("ATTRIBUTE"))
      return XMLStreamReader.ATTRIBUTE;
    if (val.equals("DTD"))
      return XMLStreamReader.DTD;
    if (val.equals("CDATA"))
      return XMLStreamReader.CDATA;
    if (val.equals("NAMESPACE"))
      return XMLStreamReader.NAMESPACE;
    return -1;
  }
}





XMLStreamReader with events

import java.io.FileInputStream;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamReader;
public class EntityReferenceTest {
  public static void main(String[] args) throws Exception {
    XMLInputFactory inputFactory = XMLInputFactory.newInstance();
    inputFactory.setProperty(XMLInputFactory.IS_COALESCING, Boolean.TRUE);
    inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.TRUE);
    XMLStreamReader reader = inputFactory.createXMLStreamReader(new FileInputStream("e.xml"));
    while (reader.hasNext()) {
      int event = reader.next();
      if (event == XMLStreamConstants.CHARACTERS)
        System.out.println(reader.getText());
      else if (event == XMLStreamConstants.ENTITY_REFERENCE) {
        System.out.println("en: " + reader.getLocalName());
        System.out.println("er: " + reader.getText());
      }
    }
    inputFactory.setProperty(XMLInputFactory.IS_REPLACING_ENTITY_REFERENCES, Boolean.FALSE);
    reader = inputFactory.createXMLStreamReader(new FileInputStream("e.xml"));
    while (reader.hasNext()) {
      int event = reader.next();
      if (event == XMLStreamConstants.CHARACTERS)
        System.out.println(reader.getText());
      else if (event == XMLStreamConstants.ENTITY_REFERENCE) {
        System.out.println("en: " + reader.getLocalName());
        System.out.println("er: " + reader.getText());
      }
    }
  }
}