下面列出了org.xml.sax.ext.Locator2#javax.xml.stream.events.XMLEvent 实例代码,或者点击链接到github查看源代码,也可以在右侧发表评论。
public static void createNode(XMLEventWriter eventWriter, String name, String value) throws XMLStreamException {
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent end = eventFactory.createDTD("\n");
XMLEvent tab = eventFactory.createDTD("\t");
// Create Start node
StartElement sElement = eventFactory.createStartElement("", "", name);
eventWriter.add(tab);
eventWriter.add(sElement);
// Create Content
Characters characters = eventFactory.createCharacters(value);
eventWriter.add(characters);
// Create End node
EndElement eElement = eventFactory.createEndElement("", "", name);
eventWriter.add(eElement);
eventWriter.add(end);
}
/**
*
* @param eventWriter
* .
* @param name
* The name.
* @param value
* The value.
* @throws XMLStreamException
* .
*/
public static void createNode(final XMLEventWriter eventWriter, final String name, final String value)
throws XMLStreamException {
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent end = eventFactory.createDTD("\n");
XMLEvent tab = eventFactory.createDTD("\t");
// Create Start node
StartElement sElement = eventFactory.createStartElement("", "", name);
eventWriter.add(tab);
eventWriter.add(sElement);
// Create Content
Characters characters = eventFactory.createCharacters(value);
eventWriter.add(characters);
// Create End node
EndElement eElement = eventFactory.createEndElement("", "", name);
eventWriter.add(eElement);
eventWriter.add(end);
}
private void handleStartDocument(final XMLEvent event) throws SAXException {
_sax.setDocumentLocator(new Locator2() {
public int getColumnNumber() {
return event.getLocation().getColumnNumber();
}
public int getLineNumber() {
return event.getLocation().getLineNumber();
}
public String getPublicId() {
return event.getLocation().getPublicId();
}
public String getSystemId() {
return event.getLocation().getSystemId();
}
public String getXMLVersion(){
return version;
}
public String getEncoding(){
return encoding;
}
});
_sax.startDocument();
}
public XMLEvent nextEvent()throws XMLStreamException{
if(super.hasNext()){
//get the next event by calling XMLEventReader
XMLEvent event = super.nextEvent();
//if this filter accepts this event then return this event
if(fEventFilter.accept(event)){
return event;
}
else{
return nextEvent();
}
}else{
throw new NoSuchElementException();
}
}
/**
* 基于迭代模型的方式解析XML
*/
@Test
public void iteratorParseXML() throws Exception {
XMLInputFactory factory = XMLInputFactory.newInstance();
InputStream is = ClassLoader.getSystemResourceAsStream("books.xml");
XMLEventReader reader = factory.createXMLEventReader(is);
int iteratorNum = 0; //统计遍历的次数
while(reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if(event.isStartElement()) { //通过XMLEvent判断节点类型
String name = event.asStartElement().getName().toString(); //通过event.asxxx转换节点
if(name.equals("title")) {
System.out.print("书籍[" + reader.getElementText() + "]");
}
if(name.equals("price")) {
System.out.println("的价格为[" + reader.getElementText() + "]");
}
}
iteratorNum++;
}
is.close();
System.out.println("本次操作遍历XML的次数合计为[" + iteratorNum + "]次");
}
/**
* <pre>
* name : THICKNESS
* attributes : THICKNESSAttribute { VALUE!, START, STARTOPEN, END, ENDOPEN }
* structure : SPELLS ?
* </pre>
*/
private void __thickness(final String edgeId) throws IOException, XMLStreamException {
XMLEvent e;
EnumMap<THICKNESSAttribute, String> attributes;
e = getNextEvent();
checkValid(e, XMLEvent.START_ELEMENT, "thickness");
attributes = getAttributes(THICKNESSAttribute.class, e.asStartElement());
checkRequiredAttributes(e, attributes, THICKNESSAttribute.VALUE);
e = getNextEvent();
if (isEvent(e, XMLEvent.START_ELEMENT, "spells")) {
pushback(e);
__spells();
e = getNextEvent();
}
checkValid(e, XMLEvent.END_ELEMENT, "thickness");
}
private int findNextEvent() throws XMLStreamException {
fStreamAdvancedByHasNext = false;
while(fStreamReader.hasNext()){
fCurrentEvent = fStreamReader.next();
if(fStreamFilter.accept(fStreamReader)){
fEventAccepted = true;
return fCurrentEvent;
}
}
//although it seems that IllegalStateException should be thrown when next() is called
//on a stream that has no more items, we have to assume END_DOCUMENT is always accepted
//in order to pass the TCK
if (fCurrentEvent == XMLEvent.END_DOCUMENT)
return fCurrentEvent;
else
return -1;
}
private String findDocIdFromXml(String xml) {
try {
XMLEventReader eventReader = XMLInputFactory.newInstance().createXMLEventReader(new StringReader(xml));
while (eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if (event.getEventType() == XMLEvent.START_ELEMENT) {
StartElement element = event.asStartElement();
String elementName = element.getName().getLocalPart();
if (VespaDocumentOperation.Operation.valid(elementName)) {
return element.getAttributeByName(QName.valueOf("documentid")).getValue();
}
}
}
} catch (XMLStreamException | FactoryConfigurationError e) {
// as json dude does
return null;
}
return null;
}
public static void createNode(XMLEventWriter eventWriter, String name, String value) throws XMLStreamException {
XMLEventFactory eventFactory = XMLEventFactory.newInstance();
XMLEvent end = eventFactory.createDTD("\n");
XMLEvent tab = eventFactory.createDTD("\t");
// Create Start node
StartElement sElement = eventFactory.createStartElement("", "", name);
eventWriter.add(tab);
eventWriter.add(sElement);
// Create Content
Characters characters = eventFactory.createCharacters(value);
eventWriter.add(characters);
// Create End node
EndElement eElement = eventFactory.createEndElement("", "", name);
eventWriter.add(eElement);
eventWriter.add(end);
}
public String getElementText() throws XMLStreamException
{
StringBuffer buffer = new StringBuffer();
XMLEvent e = nextEvent();
if (!e.isStartElement())
throw new XMLStreamException(
CommonResourceBundle.getInstance().getString("message.mustBeOnSTART_ELEMENT"));
while(hasNext()) {
e = nextEvent();
if(e.isStartElement())
throw new XMLStreamException(
CommonResourceBundle.getInstance().getString("message.getElementTextExpectTextOnly"));
if(e.isCharacters())
buffer.append(((Characters) e).getData());
if(e.isEndElement())
return buffer.toString();
}
throw new XMLStreamException(CommonResourceBundle.getInstance().getString("message.END_ELEMENTnotFound"));
}
@Override
public Flux<Object> decode(Publisher<DataBuffer> inputStream, ResolvableType elementType,
@Nullable MimeType mimeType, @Nullable Map<String, Object> hints) {
Flux<XMLEvent> xmlEventFlux = this.xmlEventDecoder.decode(
inputStream, ResolvableType.forClass(XMLEvent.class), mimeType, hints);
Class<?> outputClass = elementType.toClass();
QName typeName = toQName(outputClass);
Flux<List<XMLEvent>> splitEvents = split(xmlEventFlux, typeName);
return splitEvents.map(events -> {
Object value = unmarshal(events, outputClass);
LogFormatUtils.traceDebug(logger, traceOn -> {
String formatted = LogFormatUtils.formatValue(value, !traceOn);
return Hints.getLogPrefix(hints) + "Decoded [" + formatted + "]";
});
return value;
});
}
private static Map<String, String> readSubValues(XMLEventReader reader, QName subTagType)
throws XMLStreamException {
ImmutableMap.Builder<String, String> builder = ImmutableMap.builder();
while (reader.hasNext()
&& XmlResourceValues.isTag(XmlResourceValues.peekNextTag(reader), subTagType)) {
StartElement element = reader.nextEvent().asStartElement();
builder.put(
XmlResourceValues.getElementName(element), XmlResourceValues.getElementValue(element));
XMLEvent endTag = reader.nextEvent();
if (!XmlResourceValues.isEndTag(endTag, subTagType)) {
throw new XMLStreamException(
String.format("Unexpected [%s]; Expected %s", endTag, "</enum>"), endTag.getLocation());
}
}
return builder.build();
}
public void reset(PropertyManager propertyManager) {
super.reset(propertyManager);
// other settings
fDoctypeName = null;
fDoctypePublicId = null;
fDoctypeSystemId = null;
fSeenDoctypeDecl = false;
fNamespaceContext.reset();
fSupportDTD = ((Boolean)propertyManager.getProperty(XMLInputFactory.SUPPORT_DTD)).booleanValue();
// xerces features
fLoadExternalDTD = !((Boolean)propertyManager.getProperty(Constants.ZEPHYR_PROPERTY_PREFIX + Constants.IGNORE_EXTERNAL_DTD)).booleanValue();
setScannerState(XMLEvent.START_DOCUMENT);
setDriver(fXMLDeclDriver);
fSeenInternalSubset = false;
if(fDTDScanner != null){
((XMLDTDScannerImpl)fDTDScanner).reset(propertyManager);
}
fEndPos = 0;
fStartPos = 0;
if(fDTDDecl != null){
fDTDDecl.clear();
}
}
public static Boolean reportIsEmpty(File reportFile) throws IOException, XMLStreamException {
BufferedReader br = Files.newBufferedReader(reportFile.toPath());
try {
XMLEventReader reader = xmlInputFactory.createXMLEventReader(br);
while(reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if(event.isStartElement() && !event.asStartElement().getName().getLocalPart().equals("OWASPZAPReport")) {
return false;
}
}
} finally {
br.close();
}
return true;
}
private void parsePage(XMLEventReader eventReader) throws XMLStreamException, InterruptedException {
String title = null, text = null, redirect = null;
boolean skip = false;
while(eventReader.hasNext()) {
XMLEvent event = eventReader.nextEvent();
if(event.isEndElement() && event.asEndElement().getName().getLocalPart() == "page") {
break;
}
if(!skip && event.isStartElement()) {
StartElement startElement = event.asStartElement();
// Ignore non-main pages
if(startElement.getName().getLocalPart() == "ns")
skip |= !"0".equals(parseTextContents(eventReader));
if(startElement.getName().getLocalPart() == "title")
title = parseTextContents(eventReader);
if(startElement.getName().getLocalPart() == "text")
text = parseTextContents(eventReader);
if(startElement.getName().getLocalPart() == "redirect")
redirect = startElement.getAttributeByName(TITLEQNAME).getValue();
}
}
// Post-process page.
if(!skip && redirect == null && text == null && title != null)
System.err.println("No redirect or text, but title: " + title);
// Ignore non-main pages
if(skip || title == null || text == null)
return;
queue.put(new Article(prefix, title, redirect, text));
readprog.incrementAndLog();
}
final static String getEventTypeString(int eventType) {
switch (eventType) {
case XMLEvent.START_ELEMENT:
return "START_ELEMENT";
case XMLEvent.END_ELEMENT:
return "END_ELEMENT";
case XMLEvent.PROCESSING_INSTRUCTION:
return "PROCESSING_INSTRUCTION";
case XMLEvent.CHARACTERS:
return "CHARACTERS";
case XMLEvent.COMMENT:
return "COMMENT";
case XMLEvent.START_DOCUMENT:
return "START_DOCUMENT";
case XMLEvent.END_DOCUMENT:
return "END_DOCUMENT";
case XMLEvent.ENTITY_REFERENCE:
return "ENTITY_REFERENCE";
case XMLEvent.ATTRIBUTE:
return "ATTRIBUTE";
case XMLEvent.DTD:
return "DTD";
case XMLEvent.CDATA:
return "CDATA";
case XMLEvent.SPACE:
return "SPACE";
}
return "UNKNOWN_EVENT_TYPE, " + String.valueOf(eventType);
}
@Override
public XMLEvent nextEvent() {
if (hasNext()) {
this.currentEvent = this.events.get(this.cursor);
this.cursor++;
return this.currentEvent;
}
else {
throw new NoSuchElementException();
}
}
/**
*
* @throws XMLStreamException
* @return
*/
public int nextTag() throws XMLStreamException {
if (fStreamAdvancedByHasNext && fEventAccepted &&
(fCurrentEvent == XMLEvent.START_ELEMENT || fCurrentEvent == XMLEvent.START_ELEMENT)) {
fStreamAdvancedByHasNext = false;
return fCurrentEvent;
}
int event = findNextTag();
if (event != -1) {
return event;
}
throw new IllegalStateException("The stream reader has reached the end of the document, or there are no more "+
" items to return");
}
/** Returns the namespace of the attribute at the provided
* index
* @param index the position of the attribute
* @return the namespace URI (can be null)
* @throws IllegalStateException if this is not a START_ELEMENT or ATTRIBUTE
*/
public String getAttributeNamespace(int index) {
//State should be either START_ELEMENT or ATTRIBUTE
if( fEventType == XMLEvent.START_ELEMENT || fEventType == XMLEvent.ATTRIBUTE) {
return fScanner.getAttributeIterator().getURI(index);
} else{
throw new java.lang.IllegalStateException("Current state is not among the states "
+ getEventTypeString(XMLEvent.START_ELEMENT) + " , "
+ getEventTypeString(XMLEvent.ATTRIBUTE)
+ "valid for getAttributeNamespace()") ;
}
}
/**
* @throws XMLStreamException
* @return
*/
public boolean hasNext() throws XMLStreamException {
//the scanner returns -1 when it detects a broken stream
if (fEventType == -1) {
return false;
}
//we can check in scanners if the scanner state is not set to
//terminating, we still have more events.
return fEventType != XMLEvent.END_DOCUMENT;
}
/**
* @return
*/
public String getValue() {
if (fEventType == XMLEvent.PROCESSING_INSTRUCTION) {
return fScanner.getPIData().toString();
} else if (fEventType == XMLEvent.COMMENT) {
return fScanner.getComment();
} else if (fEventType == XMLEvent.START_ELEMENT || fEventType == XMLEvent.END_ELEMENT) {
return fScanner.getElementQName().localpart;
} else if (fEventType == XMLEvent.CHARACTERS) {
return fScanner.getCharacterData().toString();
}
return null;
}
@Override
@Nullable
public XMLEvent peek() {
if (hasNext()) {
return this.events.get(this.cursor);
}
else {
return null;
}
}
/**
* <p>Creates a new instance of a <code>StAXSource</code>
* by supplying an {@link XMLEventReader}.</p>
*
* <p><code>XMLEventReader</code> must be a
* non-<code>null</code> reference.</p>
*
* <p><code>XMLEventReader</code> must be in
* {@link XMLStreamConstants#START_DOCUMENT} or
* {@link XMLStreamConstants#START_ELEMENT} state.</p>
*
* @param xmlEventReader <code>XMLEventReader</code> used to create
* this <code>StAXSource</code>.
*
* @throws XMLStreamException If <code>xmlEventReader</code> access
* throws an <code>Exception</code>.
* @throws IllegalArgumentException If <code>xmlEventReader</code> ==
* <code>null</code>.
* @throws IllegalStateException If <code>xmlEventReader</code>
* is not in <code>XMLStreamConstants.START_DOCUMENT</code> or
* <code>XMLStreamConstants.START_ELEMENT</code> state.
*/
public StAXSource(final XMLEventReader xmlEventReader)
throws XMLStreamException {
if (xmlEventReader == null) {
throw new IllegalArgumentException(
"StAXSource(XMLEventReader) with XMLEventReader == null");
}
// TODO: This is ugly ...
// there is no way to know the current position(event) of
// XMLEventReader. peek() is the only way to know the next event.
// The next event on the input stream should be
// XMLStreamConstants.START_DOCUMENT or
// XMLStreamConstants.START_ELEMENT.
XMLEvent event = xmlEventReader.peek();
int eventType = event.getEventType();
if (eventType != XMLStreamConstants.START_DOCUMENT
&& eventType != XMLStreamConstants.START_ELEMENT) {
throw new IllegalStateException(
"StAXSource(XMLEventReader) with XMLEventReader "
+ "not in XMLStreamConstants.START_DOCUMENT or "
+ "XMLStreamConstants.START_ELEMENT state");
}
this.xmlEventReader = xmlEventReader;
systemId = event.getLocation().getSystemId();
}
private HasNextTypeFilter createFilter() {
HasNextTypeFilter f = new HasNextTypeFilter();
f.addType(XMLEvent.START_ELEMENT);
f.addType(XMLEvent.END_ELEMENT);
f.addType(XMLEvent.PROCESSING_INSTRUCTION);
f.addType(XMLEvent.CHARACTERS);
f.addType(XMLEvent.COMMENT);
f.addType(XMLEvent.SPACE);
f.addType(XMLEvent.START_DOCUMENT);
f.addType(XMLEvent.END_DOCUMENT);
return f;
}
/**
* <pre>
* <!ELEMENT graphml ((desc)?,(key)*,((data)|(graph))*)>
* </pre>
*
* @throws IOException
* @throws XMLStreamException
*/
private void __graphml() throws IOException, XMLStreamException {
XMLEvent e;
e = getNextEvent();
checkValid(e, XMLEvent.START_ELEMENT, "graphml");
e = getNextEvent();
if (isEvent(e, XMLEvent.START_ELEMENT, "desc")) {
pushback(e);
__desc();
e = getNextEvent();
}
while (isEvent(e, XMLEvent.START_ELEMENT, "key")) {
pushback(e);
__key();
e = getNextEvent();
}
while (isEvent(e, XMLEvent.START_ELEMENT, "data") || isEvent(e, XMLEvent.START_ELEMENT, "graph")) {
pushback(e);
if (isEvent(e, XMLEvent.START_ELEMENT, "data")) {
__data();
} else {
__graph();
}
e = getNextEvent();
}
checkValid(e, XMLEvent.END_ELEMENT, "graphml");
}
private String formatSection( XMLEventReader reader, String pom, Format format )
throws XMLStreamException
{
int startOfSection = getPosOfNextEvent( reader );
int[] starts = new int[sequence.size()];
int[] ends = new int[sequence.size()];
XMLEvent endScope = calculateStartsAndEnds( reader, starts, ends );
return formatSection( reader, pom, format, startOfSection, starts, ends, endScope );
}
public static String eventsToString(List<XMLEvent> events) {
byte[] bytes = eventsToBytes(events);
if (bytes == null || bytes.length == 0) {
return null;
}
return new String(bytes, Charset.forName("UTF-8"));
}
/**
* <p>Creates a new instance of a <code>StAXSource</code>
* by supplying an {@link XMLEventReader}.</p>
*
* <p><code>XMLEventReader</code> must be a
* non-<code>null</code> reference.</p>
*
* <p><code>XMLEventReader</code> must be in
* {@link XMLStreamConstants#START_DOCUMENT} or
* {@link XMLStreamConstants#START_ELEMENT} state.</p>
*
* @param xmlEventReader <code>XMLEventReader</code> used to create
* this <code>StAXSource</code>.
*
* @throws XMLStreamException If <code>xmlEventReader</code> access
* throws an <code>Exception</code>.
* @throws IllegalArgumentException If <code>xmlEventReader</code> ==
* <code>null</code>.
* @throws IllegalStateException If <code>xmlEventReader</code>
* is not in <code>XMLStreamConstants.START_DOCUMENT</code> or
* <code>XMLStreamConstants.START_ELEMENT</code> state.
*/
public StAXSource(final XMLEventReader xmlEventReader)
throws XMLStreamException {
if (xmlEventReader == null) {
throw new IllegalArgumentException(
"StAXSource(XMLEventReader) with XMLEventReader == null");
}
// TODO: This is ugly ...
// there is no way to know the current position(event) of
// XMLEventReader. peek() is the only way to know the next event.
// The next event on the input stream should be
// XMLStreamConstants.START_DOCUMENT or
// XMLStreamConstants.START_ELEMENT.
XMLEvent event = xmlEventReader.peek();
int eventType = event.getEventType();
if (eventType != XMLStreamConstants.START_DOCUMENT
&& eventType != XMLStreamConstants.START_ELEMENT) {
throw new IllegalStateException(
"StAXSource(XMLEventReader) with XMLEventReader "
+ "not in XMLStreamConstants.START_DOCUMENT or "
+ "XMLStreamConstants.START_ELEMENT state");
}
this.xmlEventReader = xmlEventReader;
systemId = event.getLocation().getSystemId();
}
private String elementValue(XMLEventReader reader, StartElement element) throws XMLStreamException {
while (reader.hasNext()) {
XMLEvent event = reader.peek();
if (event.isStartElement() || event.isEndElement()) {
return null;
} else if (event.isCharacters()){
reader.nextEvent();
String data = event.asCharacters().getData();
if (data.trim().length() > 0) {
return data.trim();
}
}
}
return null;
}
/**
* @return
*/
public String getNamespaceURI() {
//doesn't take care of Attribute as separte event
if(fEventType == XMLEvent.START_ELEMENT || fEventType == XMLEvent.END_ELEMENT){
return fScanner.getElementQName().uri ;
}
return null ;
}