javax.xml.stream

接口
异常
错误
所有超级接口:
XMLStreamConstants
所有已知实现类:
StreamReaderDelegate

public interface XMLStreamReader
     
extends XMLStreamConstants

XMLStreamReader 接口允许转发 XML 和对 XML 的只读访问。它被设计为读取 XML 数据的最低层且最有效的方法。

XMLStreamReader 被设计为使用 next() 和 hasNext() 在 XML 上进行迭代。可以使用诸如 getEventType()、getNamespaceURI()、getLocalName() 和 getText() 之类的方法访问数据:

next() 方法会使 reader 读取下一个解析事件。next() 方法返回一个整数,指示刚才读取的事件类型。

事件类型可以使用 getEventType() 来确定。

解析事件被定义为 XML 声明、DTD、开始标记、字符数据、空格、结束标记、注释或处理指令。属性或名称空间事件可以作为查询操作的结果在文档的根级别出现。

为了遵守 XML 1.0,XML 处理器必须将已声明的未解析实体的标识符、注释声明及其关联标识符传递给应用程序。此信息通过此接口上的属性 API 提供。以下两个属性允许访问此信息:javax.xml.stream.notations 和 javax.xml.stream.entities。当前事件为 DTD 时,以下调用将返回一个 Notation 列表 List l = (List) getProperty("javax.xml.stream.notations"); 以下调用将返回一个实体声明列表:List l = (List) getProperty("javax.xml.stream.entities"); 这些属性只能在 DTD 事件中访问,并且被定义为如果信息不可用,则返回 null。

下表描述了各种状态所对应的有效方法。如果某种方法是在无效状态中调用的,则该方法将抛出 java.lang.IllegalStateException。

每种状态对应的有效方法
事件类型 有效方法
所有状态 getProperty()、hasNext()、require()、close()、getNamespaceURI()、isStartElement()、isEndElement()、isCharacters()、isWhiteSpace()、getNamespaceContext()、getEventType()、getLocation()、hasText()、hasName()
START_ELEMENT next()、getName()、getLocalName()、hasName()、getPrefix()、getAttributeXXX()、isAttributeSpecified()、getNamespaceXXX()、getElementText()、nextTag()
ATTRIBUTE next()、nextTag()、getAttributeXXX()、isAttributeSpecified()
NAMESPACE next()、nextTag()、getNamespaceXXX()
END_ELEMENT next()、getName()、getLocalName()、hasName()、getPrefix()、getNamespaceXXX()、nextTag()
CHARACTERS next()、getTextXXX()、nextTag()
CDATA next()、getTextXXX()、nextTag()
COMMENT next()、getTextXXX()、nextTag()
SPACE next()、getTextXXX()、nextTag()
START_DOCUMENT next()、getEncoding()、getVersion()、isStandalone()、standaloneSet()、getCharacterEncodingScheme()、nextTag()
END_DOCUMENT close()
PROCESSING_INSTRUCTION next()、getPITarget()、getPIData()、nextTag()
ENTITY_REFERENCE next()、getLocalName()、getText()、nextTag()
DTD next()、getText()、nextTag()

从以下版本开始:
1.6
另请参见:
XMLEvent, XMLInputFactory, XMLStreamWriter

字段摘要
 
从接口 javax.xml.stream.XMLStreamConstants 继承的字段
ATTRIBUTE, CDATA, CHARACTERS, COMMENT, DTD, END_DOCUMENT, END_ELEMENT, ENTITY_DECLARATION, ENTITY_REFERENCE, NAMESPACE, NOTATION_DECLARATION, PROCESSING_INSTRUCTION, SPACE, START_DOCUMENT, START_ELEMENT
 
方法摘要
 void close()
          释放与此 Reader 关联的所有资源。
 int getAttributeCount()
          返回此 START_ELEMENT 中的属性计数,此方法仅对 START_ELEMENT 或 ATTRIBUTE 有效。
 String getAttributeLocalName(int index)
          返回所提供索引处的属性的 localName
 QName getAttributeName(int index)
          返回所提供索引处的属性的 qname
 String getAttributeNamespace(int index)
          返回所提供索引处的属性的名称空间
 String getAttributePrefix(int index)
          返回所提供索引处的属性的前缀
 String getAttributeType(int index)
          返回所提供索引处的属性的 XML 类型
 String getAttributeValue(int index)
          返回 index 处的属性值
 String getAttributeValue(String namespaceURI, String localName)
          返回带有名称空间和 localName 的属性的规范化属性值。
 String getCharacterEncodingScheme()
          返回 xml 声明中声明的字符编码。
 String getElementText()
          读取纯文本元素的内容,如果不是纯文本元素,则抛出异常。
 String getEncoding()
          如果输入编码已知,则返回输入编码;如果未知,则返回 null。
 int getEventType()
          返回一个整数码,指示光标所指向的事件的类型。
 String getLocalName()
          返回当前事件的(本地)名称。
 Location getLocation()
          返回处理器的当前位置。
 QName getName()
          返回当前 START_ELEMENT 或 END_ELEMENT 事件的 QName
 NamespaceContext getNamespaceContext()
          返回当前位置的只读名称空间上下文。
 int getNamespaceCount()
          返回在 START_ELEMENT 或 END_ELEMENT 中声明的名称空间的计数,此方法仅对 START_ELEMENT、END_ELEMENT 或 NAMESPACE 有效。
 String getNamespacePrefix(int index)
          返回在 index 处声明的名称空间前缀。
 String getNamespaceURI()
          如果当前事件是 START_ELEMENT 或 END_ELEMENT,则此方法返回前缀的 URI 或默认名称空间。
 String getNamespaceURI(int index)
          返回在 index 处声明的名称空间 URI。
 String getNamespaceURI(String prefix)
          返回给定前缀的 URI。
 String getPIData()
          获取处理指令的数据节
 String getPITarget()
          获取处理指令的目标
 String getPrefix()
          返回当前事件的前缀,如果事件没有前缀,则返回 null
 Object getProperty(String name)
          从底层实现获取功能/属性的值
 String getText()
          以字符串的形式返回解析事件的当前值,此方法返回 CHARACTERS 事件的字符串值,返回 COMMENT 的值、ENTITY_REFERENCE 的替代值、CDATA 节的字符串值、SPACE 事件的字符串值、DTD 内部子集的字符串值。
 char[] getTextCharacters()
          返回一个包含此事件中字符的数组。
 int getTextCharacters(int sourceStart, char[] target, int targetStart, int length)
          获取与 CHARACTERS、SPACE 或 CDATA 事件关联的文本。
 int getTextLength()
          返回文本字符数组中此文本事件的字符序列长度。
 int getTextStart()
          返回存储(此文本事件的)第一个字符位置处的文本字符数组的偏移量。
 String getVersion()
          获取在 xml 声明中声明的 xml 版本,如果没有声明版本,则返回 null
 boolean hasName()
          如果当前事件有名称(是 START_ELEMENT 或 END_ELEMENT),则返回 ture,否则返回 false
 boolean hasNext()
          如果有多个解析事件,则返回 true,如果不再有事件,则返回 false。
 boolean hasText()
          如果当前事件具有文本,则返回 true,否则返回 false。
 boolean isAttributeSpecified(int index)
          返回一个 boolean 值,它指示此属性是否为默认创建的
 boolean isCharacters()
          如果光标指向字符数据事件,则返回 true
 boolean isEndElement()
          如果光标指向结束标记,则返回 true(否则返回 false)
 boolean isStandalone()
          获取 xml 声明中的独立声明
 boolean isStartElement()
          如果光标指向开始标记,则返回 true(否则返回 false)
 boolean isWhiteSpace()
          如果光标指向由所有空格组成的字符数据事件,则返回 true
 int next()
          获取下一个解析事件??处理器可以用单个存储块返回所有连续的字符数据,它也可以将其分割成几个存储块。
 int nextTag()
          在到达 START_ELEMENT 或 END_ELEMENT 之前,跳过所有空格(isWhiteSpace() 返回 true)、COMMENT 或 PROCESSING_INSTRUCTION。
 void require(int type, String namespaceURI, String localName)
          测试当前事件是否属于给定的类型,以及名称空间和名称是否与当前事件的当前名称空间和名称相匹配。
 boolean standaloneSet()
          检查文档中是否设置了独立
 

方法详细信息

getProperty

Object getProperty(String name)
                   throws IllegalArgumentException
从底层实现获取功能/属性的值

参数:
name - 属性的名称,不可以为 null
返回:
属性的值
抛出:
IllegalArgumentException - 如果名称为 null

next

int next()
         throws XMLStreamException
获取下一个解析事件??处理器可以用单个存储块返回所有连续的字符数据,它也可以将其分割成几个存储块。如果属性 javax.xml.stream.isCoalescing 设置为 true,则元素内容必须组合,对于连续元素内容或 CDATA 节,只需要返回一个 CHARACTERS 事件。 默认情况下,必须扩展实体引用,并透明地报告给应用程序。如果实体引用不能扩展,则抛出异常。如果元素内容为空(即内容为 ""),则不报告 CHARACTERS 事件。

假设给定以下 XML:
<foo><!--description-->内容文本<![CDATA[<greeting>Hello</greeting>]]>其他内容</foo>
对 foo 调用 next() 的行为将是:
1- 注释 (COMMENT)
2- 然后是字符节 (CHARACTERS)
3- 接下来是 CDATA 节(另一个 CHARACTERS)
4- 再接下来是下一个字符节 (另一个 CHARACTERS)
5- 最后是 END_ELEMENT

注: 空元素(如 <tag/>)将用以下两个单独的事件报告:START_ELEMENT 和 END_ELEMENT??这保证了空元素对 <tag></tag> 解析的等效性。 如果是在 hasNext() 返回 false 之后调用此方法,则此方法将抛出 IllegalStateException。

返回:
与当前解析事件相对应的整数码
抛出:
NoSuchElementException - 如果在 hasNext() 返回 false 时调用
XMLStreamException - 如果处理底层 XML 源时发生错误
另请参见:
XMLEvent

require

void require(int type,
             String namespaceURI,
             String localName)
             throws XMLStreamException
测试当前事件是否属于给定的类型,以及名称空间和名称是否与当前事件的当前名称空间和名称相匹配。如果 namespaceURI 为 null,则该参数不进行相等性检查;如果 localName 为 null,则该参数不进行相等性检查。

参数:
type - 事件类型
namespaceURI - 事件的 URI,可以为 null
localName - 事件的 localName,可以为 null
抛出:
XMLStreamException - 如果所需值不匹配。

getElementText

String getElementText()
                      throws XMLStreamException
读取纯文本元素的内容,如果不是纯文本元素,则抛出异常。无论 javax.xml.stream.isCoalescing 的值如何,此方法始终返回组合的内容。
前置条件:当前事件是 START_ELEMENT。
后置条件:当前事件是相应的 END_ELEMENT。
此方法执行下列操作(实现可以随意优化,但必须执行等效处理):
if(getEventType() != XMLStreamConstants.START_ELEMENT) {
throw new XMLStreamException(
"parser must be on START_ELEMENT to read next text", getLocation());
 }
int eventType = next();
StringBuffer content = new StringBuffer();
while(eventType != XMLStreamConstants.END_ELEMENT ) {
if(eventType == XMLStreamConstants.CHARACTERS
|| eventType == XMLStreamConstants.CDATA
|| eventType == XMLStreamConstants.SPACE
|| eventType == XMLStreamConstants.ENTITY_REFERENCE) {
buf.append(getText());
} else if(eventType == XMLStreamConstants.PROCESSING_INSTRUCTION
|| eventType == XMLStreamConstants.COMMENT) {
// skipping
} else if(eventType == XMLStreamConstants.END_DOCUMENT) {
throw new XMLStreamException(
"unexpected end of document when reading element text content", this);
} else if(eventType == XMLStreamConstants.START_ELEMENT) {
throw new XMLStreamException(
"element text content may not contain START_ELEMENT", getLocation());
} else {
throw new XMLStreamException(
"Unexpected event type "+eventType, getLocation());
 }
eventType = next();
 }
return buf.toString();
 

抛出:
XMLStreamException - 如果当前事件不是 START_ELEMENT 或者遇到了非文本元素

nextTag

int nextTag()
            throws XMLStreamException
在到达 START_ELEMENT 或 END_ELEMENT 之前,跳过所有空格(isWhiteSpace() 返回 true)、COMMENT 或 PROCESSING_INSTRUCTION。如果遇到空格字符、COMMENT、PROCESSING_INSTRUCTION、START_ELEMENT、END_ELEMENT 以外的其他内容,则抛出异常。在处理以空格分隔的纯元素内容时,应使用此方法。
前置条件:无
后置条件:当前事件为 START_ELEMENT 或 END_ELEMENT,并且光标已经移到任何空格事件上。
它实际上执行下列操作(实现可以随意优化,但必须执行等效处理):
int eventType = next();
while((eventType == XMLStreamConstants.CHARACTERS && isWhiteSpace()) // skip whitespace
|| (eventType == XMLStreamConstants.CDATA && isWhiteSpace()) 
// skip whitespace
|| eventType == XMLStreamConstants.SPACE
|| eventType == XMLStreamConstants.PROCESSING_INSTRUCTION
|| eventType == XMLStreamConstants.COMMENT
 ) {
eventType = next();
 }
if (eventType != XMLStreamConstants.START_ELEMENT && eventType != XMLStreamConstants.END_ELEMENT) {
throw new String XMLStreamException("expected start or end tag", getLocation());
 }
return eventType;
 

返回:
元素读取的事件类型(START_ELEMENT 或 END_ELEMENT)
抛出:
XMLStreamException - 如果当前事件不是空格、PROCESSING_INSTRUCTION、START_ELEMENT 或 END_ELEMENT
NoSuchElementException - 如果它在 hasNext() 返回 false 时被调用

hasNext

boolean hasNext()
                throws XMLStreamException
如果有多个解析事件,则返回 true,如果不再有事件,则返回 false。如果 XMLStreamReader 的当前状态为 END_DOCUMENT,则此方法返回 false

返回:
如果有多个事件,则返回 true,否则返回 false
抛出:
XMLStreamException - 如果检测下一个状态时发生严重错误

close

void close()
           throws XMLStreamException
释放与此 Reader 关联的所有资源。此方法不会关闭底层输入源。

抛出:
XMLStreamException - 如果释放关联资源时发生错误

getNamespaceURI

String getNamespaceURI(String prefix)
返回给定前缀的 URI。返回的 URI 取决于处理器的当前状态。

注:根据 Namespaces in XML 规范中的定义,'xml' 前缀被绑定到 "http://www.w3.org/XML/1998/namespace"。

注:'xmlns' 前缀必须被解析到以下名称空间:http://www.w3.org/2000/xmlns/

参数:
prefix - 要查找的前缀,不可以为 null
返回:
绑定到给定前缀的 URI,如果未绑定,则返回 null
抛出:
IllegalArgumentException - 如果前缀为 null

isStartElement

boolean isStartElement()
如果光标指向开始标记,则返回 true(否则返回 false)

返回:
如果光标指向开始标记,则返回 true,否则返回 false

isEndElement

boolean isEndElement()
如果光标指向结束标记,则返回 true(否则返回 false)

返回:
如果光标指向结束标记,则返回 true,否则返回 false

isCharacters

boolean isCharacters()
如果光标指向字符数据事件,则返回 true

返回:
如果光标指向字符数据,则返回 true,否则返回 false

isWhiteSpace

boolean isWhiteSpace()
如果光标指向由所有空格组成的字符数据事件,则返回 true

返回:
如果光标指向所有空格,则返回 true,否则返回 false

getAttributeValue

String getAttributeValue(String namespaceURI,
                         String localName)
返回带有名称空间和 localName 的属性的规范化属性值。如果 namespaceURI 为 null,则名称空间不进行相等性检查

参数:
namespaceURI - 属性的名称空间
localName - 属性的本地名称,不可以为 null
返回:
返回属性的值,如果未找到,则返回 null
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

getAttributeCount

int getAttributeCount()
返回此 START_ELEMENT 中的属性计数,此方法仅对 START_ELEMENT 或 ATTRIBUTE 有效。此计数不包括名称空间定义。属性索引从零开始。

返回:
返回属性数
抛出:
IllegalStateException - 如果这不是 START_ELEMENT 或 ATTRIBUTE

getAttributeName

QName getAttributeName(int index)
返回所提供索引处的属性的 qname

参数:
index - 属性的位置
返回:
属性的 QName
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

getAttributeNamespace

String getAttributeNamespace(int index)
返回所提供索引处的属性的名称空间

参数:
index - 属性的位置
返回:
名称空间 URI(可以为 null)
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

getAttributeLocalName

String getAttributeLocalName(int index)
返回所提供索引处的属性的 localName

参数:
index - 属性的位置
返回:
属性的 localName
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

getAttributePrefix

String getAttributePrefix(int index)
返回所提供索引处的属性的前缀

参数:
index - 属性的位置
返回:
属性的前缀
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

getAttributeType

String getAttributeType(int index)
返回所提供索引处的属性的 XML 类型

参数:
index - 属性的位置
返回:
属性的 XML 类型
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

getAttributeValue

String getAttributeValue(int index)
返回 index 处的属性值

参数:
index - 属性的位置
返回:
属性值
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

isAttributeSpecified

boolean isAttributeSpecified(int index)
返回一个 boolean 值,它指示此属性是否为默认创建的

参数:
index - 属性的位置
返回:
如果这是一个默认属性,则返回 true
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 ATTRIBUTE

getNamespaceCount

int getNamespaceCount()
返回在 START_ELEMENT 或 END_ELEMENT 中声明的名称空间的计数,此方法仅对 START_ELEMENT、END_ELEMENT 或 NAMESPACE 有效。对于 END_ELEMENT,计数是最大的名称空间范围。它等同于 SAX 回调所报告的有关结束元素事件的信息。

返回:
返回此特定元素中的名称空间声明数
抛出:
IllegalStateException - 如果不是 START_ELEMENT、END_ELEMENT 或 NAMESPACE

getNamespacePrefix

String getNamespacePrefix(int index)
返回在 index 处声明的名称空间前缀。如果是默认名称空间声明,则返回 null

参数:
index - 名称空间声明的位置
返回:
返回名称空间前缀
抛出:
IllegalStateException - 如果不是 START_ELEMENT、END_ELEMENT 或 NAMESPACE

getNamespaceURI

String getNamespaceURI(int index)
返回在 index 处声明的名称空间 URI。

参数:
index - 名称空间声明的位置
返回:
返回名称空间 URI
抛出:
IllegalStateException - 如果不是 START_ELEMENT、END_ELEMENT 或 NAMESPACE

getNamespaceContext

NamespaceContext getNamespaceContext()
返回当前位置的只读名称空间上下文。上下文为 transient,只在调用 next() 更改 reader 的状态之前才有效。

返回:
返回名称空间上下文

getEventType

int getEventType()
返回一个整数码,指示光标所指向的事件的类型。


getText

String getText()
以字符串的形式返回解析事件的当前值,此方法返回 CHARACTERS 事件的字符串值,返回 COMMENT 的值、ENTITY_REFERENCE 的替代值、CDATA 节的字符串值、SPACE 事件的字符串值、DTD 内部子集的字符串值。如果已经解析了 ENTITY_REFERENCE,则所有字符数据都将被报告为 CHARACTERS 事件。

返回:
当前文本或 null
抛出:
IllegalStateException - 如果此状态不是有效的文本状态。

getTextCharacters

char[] getTextCharacters()
返回一个包含此事件中字符的数组。此数组应被视为只读的和 transient,即在 XMLStreamReader 移动到下一个事件之前,数组将包含文本字符。试图在超出该时间范围后保存到字符数组,或者试图修改数组的内容,这些都是违背此接口约定的行为。

返回:
当前文本或空数组
抛出:
IllegalStateException - 如果此状态不是有效的文本状态。

getTextCharacters

int getTextCharacters(int sourceStart,
                      char[] target,
                      int targetStart,
                      int length)
                      throws XMLStreamException
获取与 CHARACTERS、SPACE 或 CDATA 事件关联的文本。以 "sourceStart" 开始的文本被复制到以 "targetStart" 开始的 "target" 中。最多复制 "length" 个字符。返回实际复制的字符数。 "sourceStart" 参数必须大于等于 0 且小于等于与事件关联的字符数。通常,一个请求文本以 "sourceStart" 为 0 开始。如果实际复制的字符数小于 "length",则表示没有更多的文本。否则,在检索完所有文本之前,需要进行后续的调用。例如: int length = 1024; char[] myBuffer = new char[ length ]; for ( int sourceStart = 0 ; ; sourceStart += length ) { int nCopied = stream.getTextCharacters( sourceStart, myBuffer, 0, length ); if (nCopied < length) break; } 如果在底层源中存在任何 XML 错误,则抛出 XMLStreamException。"targetStart" 参数必须大于等于 0 且小于 "target" 的长度,Length 必须大于 0,而 "targetStart + length" 必须小于等于 "target" 的长度。

参数:
sourceStart - 要复制的源数组中第一个字符的索引
target - 目标数组
targetStart - 目标数组中的起始偏移量
length - 要复制的字符数
返回:
实际复制的字符数
抛出:
XMLStreamException - 如果底层 XML 源不是格式良好的
IndexOutOfBoundsException - 如果 targetStart < 0 或 > 目标长度
IndexOutOfBoundsException - 如果 length < 0 或 targetStart + length > 目标长度
UnsupportedOperationException - 如果此方法不受支持
NullPointerException - 如果目标为 null

getTextStart

int getTextStart()
返回存储(此文本事件的)第一个字符位置处的文本字符数组的偏移量。

抛出:
IllegalStateException - 如果此状态不是有效的文本状态。

getTextLength

int getTextLength()
返回文本字符数组中此文本事件的字符序列长度。

抛出:
IllegalStateException - 如果此状态不是有效的文本状态。

getEncoding

String getEncoding()
如果输入编码已知,则返回输入编码;如果未知,则返回 null。

返回:
此实例的编码或 null

hasText

boolean hasText()
如果当前事件具有文本,则返回 true,否则返回 false。以下事件具有文本:CHARACTERS、DTD、ENTITY_REFERENCE、COMMENT、SPACE


getLocation

Location getLocation()
返回处理器的当前位置。如果 Location 未知,则处理器应返回 Location 的实现,该实现对位置返回 -1,对 publicId 和 systemId 返回 null。位置信息仅在调用 next() 之前有效。


getName

QName getName()
返回当前 START_ELEMENT 或 END_ELEMENT 事件的 QName

返回:
当前 START_ELEMENT 或 END_ELEMENT 事件的 QName
抛出:
IllegalStateException - 如果不是 START_ELEMENT 或 END_ELEMENT

getLocalName

String getLocalName()
返回当前事件的(本地)名称。对于 START_ELEMENT 或 END_ELEMENT,返回当前元素的(本地)名称。对于 ENTITY_REFERENCE,返回实体名称。当前事件必须是 START_ELEMENT、END_ELEMENT 或 ENTITY_REFERENCE

返回:
localName
抛出:
IllegalStateException - 如果不是 START_ELEMENT、END_ELEMENT 或 ENTITY_REFERENCE