[英]How to parse xml and get the corresponding values using Stax Iterator ?
I would like to parse xml node using STAX Iterator API and get the values of each id node. 我想使用STAX Iterator API解析xml节点并获取每个id节点的值。 In the below code, how do I get the corresponding value of id type=id2 or id3.
在下面的代码中,如何获取id type = id2或id3的对应值。 How can I do this?
我怎样才能做到这一点?
<entity>
<id type="id1">8500123</id>
<id type="id2">8500124</id>
<id type="id3">8500125</id>
<link idType="someId">99369</link>
</entity>
STAX Iterator API code below; 下面的STAX Iterator API代码;
XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(new FileInputStream(fileName));
while (xmlEventReader.hasNext()) {
XMLEvent xmlEvent = xmlEventReader.nextEvent();
if (xmlEvent.isStartElement()) {
StartElement startElement = xmlEvent.asStartElement();
if (startElement.getName().getLocalPart().equals("entity")) {
XMLEvent xmlEvent2 = xmlEventReader.nextEvent();//has to forgo this bcoz it always return a new line.
XMLEvent xmlEvent3 = xmlEventReader.nextEvent();
if (xmlEvent3.isStartElement()) {
StartElement startElement2 = xmlEvent3.asStartElement();
if (startElement2.getName().getLocalPart().equals("id")) {
connector = new Connector();
Attribute idAttr = startElement2.getAttributeByName(new QName("type"));
if(idAttr.getName().equals("id1")){
connector.setId1(idAttr.getValue());
}
}
}
}
}
}
Since the question is old there is probably no longer an issue, but I was just trying to do the same thing. 由于问题很旧,可能不再是问题,但是我只是想做同样的事情。 The sample code was almost there;
样本代码几乎在那儿了。 the missing step was to check for an event type of
XMLStreamConstants.CHARACTERS
which corresponds to either: 缺少的步骤是检查
XMLStreamConstants.CHARACTERS
的事件类型,该事件类型对应于以下任意一个:
So in your case you want to extract the data only if all of these conditions are met: 因此,在您的情况下,仅在满足所有以下条件时才要提取数据:
XMLStreamConstants.CHARACTERS
(in which case EventType.isCharacters()
returns true). XMLStreamConstants.CHARACTERS
(在这种情况下, EventType.isCharacters()
返回true)。 XMLStreamConstants.START_ELEMENT
. XMLStreamConstants.START_ELEMENT
类型。 It's possible to do that by tweaking your existing code, but a cleaner and more generic approach is to iteratively process the events returned by XMLEventReader
using a case
statement. 可以通过调整现有代码来做到这一点,但是更干净,更通用的方法是使用
case
语句迭代处理XMLEventReader
返回的事件。 To get the value of the data between a start tag and end tag: 要获取开始标记和结束标记之间的数据值:
Characters characters = xmlEvent.asCharacters();
String data = characters.getData();
Here's a working example, where the file sample.xml contains the data in the OP: 这是一个工作示例,其中sample.xml文件包含OP中的数据:
package pkg;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;
import javax.xml.namespace.QName;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamConstants;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.Characters;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;
public class StaxDemo {
public static void main(String[] args) throws XMLStreamException, IOException {
try (Reader reader = new FileReader("sample.xml");) {
XMLInputFactory xmlInputFactory = XMLInputFactory.newFactory();
XMLEventReader xmlEventReader = xmlInputFactory.createXMLEventReader(reader);
parseXml(xmlEventReader);
}
}
static void parseXml(XMLEventReader xmlEventReader) throws XMLStreamException {
String typeValue = null;
while (xmlEventReader.hasNext()) {
XMLEvent xmlEvent = xmlEventReader.nextEvent();
switch (xmlEvent.getEventType()) {
case XMLStreamConstants.START_DOCUMENT:
System.out.println("XMLEvent.START_DOCUMENT");
break;
case XMLStreamConstants.START_ELEMENT:
StartElement startElement = xmlEvent.asStartElement();
Attribute typeAttribute = startElement.getAttributeByName(new QName("type"));
if (typeAttribute != null) {
typeValue = typeAttribute.getValue();
}
System.out.println("XMLEvent.START_ELEMENT: <" + startElement.getName() + "> " + "type=" + typeValue);
break;
case XMLStreamConstants.CHARACTERS:
Characters characters = xmlEvent.asCharacters();
if ((typeValue != null)) { // Non-null if preceding event was for START_ELEMENT.
if ((typeValue.equals("id2")) || (typeValue.equals("id3"))) {
String data = characters.getData();
System.out.println("XMLEvent.CHARACTERS: data=[" + data + "]");
}
typeValue = null;
}
break;
case XMLStreamConstants.END_ELEMENT:
EndElement endElement = xmlEvent.asEndElement();
System.out.println("XMLEvent.END_ELEMENT: </" + endElement.getName() + ">");
break;
case XMLStreamConstants.END_DOCUMENT:
System.out.println("XMLEvent.END_DOCUMENT");
break;
default:
System.out.println("case default: Event Type = " + xmlEvent.getEventType());
break;
}
}
}
}
I added a few println()
calls just to clarify how the file is processed by XMLEventReader
. 我添加了几个
println()
调用只是为了阐明XMLEventReader
如何处理文件。 Here's the output: 这是输出:
XMLEvent.START_DOCUMENT
XMLEvent.START_ELEMENT: <entity> type=null
XMLEvent.START_ELEMENT: <id> type=id1
XMLEvent.END_ELEMENT: </id>
XMLEvent.START_ELEMENT: <id> type=id2
XMLEvent.CHARACTERS: data=[z8500124]
XMLEvent.END_ELEMENT: </id>
XMLEvent.START_ELEMENT: <id> type=id3
XMLEvent.CHARACTERS: data=[z8500125]
XMLEvent.END_ELEMENT: </id>
XMLEvent.START_ELEMENT: <link> type=null
XMLEvent.END_ELEMENT: </link>
XMLEvent.END_ELEMENT: </entity>
XMLEvent.END_DOCUMENT
Oracle provides a tutorial for StAX . Oracle提供了StAX的教程 。 While all the basic information is there, I found it a bit disorganized.
尽管所有基本信息都在这里,但我发现它有点混乱。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.