Java 如何通过stAX或SAX从xml字符串获取特定事件/属性内容
我有一个xml POST响应,作为字符串接收。我需要特定“pnr”(见xml)的内容将其传递给另一个GET请求。 我正在尝试sax和stAX来实现这一点,但失败得很惨。 我使用了getElementsByTagName和getAttribute,但没有go。。。 这是我的代码,稍后是我收到的xml字符串 任何形式的帮助都是一份礼物Java 如何通过stAX或SAX从xml字符串获取特定事件/属性内容,java,xml,parsing,sax,stax,Java,Xml,Parsing,Sax,Stax,我有一个xml POST响应,作为字符串接收。我需要特定“pnr”(见xml)的内容将其传递给另一个GET请求。 我正在尝试sax和stAX来实现这一点,但失败得很惨。 我使用了getElementsByTagName和getAttribute,但没有go。。。 这是我的代码,稍后是我收到的xml字符串 任何形式的帮助都是一份礼物 package rest; import javax.xml.parsers.*; import org.xml.sax.InputSource; import or
package rest;
import javax.xml.parsers.*;
import org.xml.sax.InputSource;
import org.w3c.dom.*;
import java.io.*;
public class ParseXMLString {
public static void main(String arg[]) {
String outputString = RESTClient.postConfirm(); // this is the xml string response I am getting
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
InputSource is = new InputSource();
is.setCharacterStream(new StringReader(outputString));
Document doc = db.parse(is);
String Parentnode = doc.getDocumentElement().getAttribute("pnr");
// Element element = (Element) Parentnode.;
// NodeList name = element.getElementsByTagName("pnr");
// Element line = (Element) name.item(0);
//String IDList = getCharacterDataFromElement(line);
System.out.println(Parentnode);
}
catch (Exception e) {
e.printStackTrace();
}
}
public static String getCharacterDataFromElement(Element e) {
Node child = e.getFirstChild();
if (child instanceof CharacterData) {
CharacterData cd = (CharacterData) child;
return cd.getData();
}
return "?";
}
}
下面是我收到的XML字符串:
<?xml version="1.0" encoding="UTF-8"?><Ticket><bookedSeats>3</bookedSeats><bpAddress>Anand Rao Circle</bpAddress><bpLandMark>ganesha temple</bpLandMark><bpLocation> Ghousia College</bpLocation><bpPhoneNo>98798679769</bpPhoneNo><bpTime>1200</bpTime><busServiceName>efdf</busServiceName><busType>Volvo A/C Semi Sleeper (2+2)</busType><commission>66.19</commission><dateOfJourney>2012-10-05</dateOfJourney><destination>Chennai</destination><fare>600.0</fare><issueTime>2012-10-04T15:46:45.073+05:30</issueTime><noOfSeats>1</noOfSeats><passengerMobile>1234567890</passengerMobile><passengerName>Test</passengerName><pnr>RATPKES44974756</pnr><seatDetails><seatDetail><commission>66.19</commission><fare>600.0</fare><gender>MALE</gender><passengerAge>0</passengerAge><passengerMobile>1234567890</passengerMobile><passengerName>Test</passengerName><prime>false</prime><seatName>3</seatName></seatDetail></seatDetails><source>Bangalore</source><status>BOOKED</status><travelsName>Rajratan Travels</travelsName></Ticket>
3和Rao Circleganesha temple Ghousia College 987986797691200EFDFVolvo A/C半卧铺(2+2)66.192012-10-05Chennai600.02012-10-04T15:46:45.073+05:3011234567890斯特拉特普克斯4497475666.19600.0马里01234567890班加罗德拉坦旅行
这段代码将为您提供pnr:
NodeList nodeLst = doc.getElementsByTagName("Ticket");
Node ticket = nodeLst.item(0);
NodeList attr = ticket.getChildNodes();
for (int i = 0; i < attr.getLength(); i++){
if (attr.item(i).getNodeName().equals("pnr"))
System.out.println(attr.item(i).getTextContent());
}
NodeList nodeLst=doc.getElementsByTagName(“票证”);
节点票证=节点列表项(0);
NodeList attr=ticket.getChildNodes();
对于(int i=0;i
如果要解决这个问题,我可能会使用XPath。但是,由于您特别要求使用StAX,下面是一个示例解析器(请注意,这只是入门的框架代码)
导入java.io.StringReader;
导入java.util.Iterator;
导入javax.xml.stream.XMLEventReader;
导入javax.xml.stream.XMLInputFactory;
导入javax.xml.stream.XMLStreamException;
导入javax.xml.stream.XMLStreamReader;
导入javax.xml.stream.events.Attribute;
导入javax.xml.stream.events.Characters;
导入javax.xml.stream.events.EndElement;
导入javax.xml.stream.events.StartElement;
导入javax.xml.stream.events.XMLEvent;
公共类ParseXMLStringStAX{
私有静态最终字符串PNR=“PNR”;
私有字符串;
公共字符串分析(字符串xmlString)引发XMLStreamException,异常{
XMLEventReader=null;
试一试{
if(xmlString==null | | xmlString.isEmpty()){
抛出新的IllegalArgumentException(“非法初始化(xmlString为null或空)”;
}
StringReader StringReader=新的StringReader(xmlString);
XMLInputFactory inputFact=XMLInputFactory.newInstance();
XMLStreamReader streamReader=inputFact.createXMLStreamReader(stringReader);
reader=inputFact.createXMLEventReader(streamReader);
while(reader.hasNext()){
XMLEvent事件=reader.nextEvent();
if(event.isCharacters()){
人物(事件);
}
if(event.isStartElement()){
startElement(事件);
//句柄属性
迭代器属性=event.asStartElement().getAttributes();
while(attributes.hasNext()){
属性(attributes.next());
}
}
if(event.isEndElement()){
//找到我们想要的了吗?
如果(事件){
endDocument(空);
打破
}
}
if(event.isStartDocument()){
开始文件(事件);
}
if(event.isEndDocument()){
结束文件(事件);
}
}
}捕获(XMLStreamException ex){
掷骰子;
}最后{
试一试{
if(读卡器!=null){
reader.close();
}
}捕获(XMLStreamException ex){
}
}
返回字符;
}
私有void属性(XMLEvent事件)引发异常{
}
私有无效字符(XMLEvent事件)引发异常{
Characters asCharacters=event.asCharacters();
if(asCharacters.isWhiteSpace())
回来
如果(字符==null){
characters=asCharacters.getData();
}否则{
characters+=asCharacters.getData();
}
}
私有void startElement(XMLEvent事件)引发异常{
StartElement StartElement=event.asStartElement();
字符串名称=startElement.getName().getLocalPart();
字符=空;
}
私有布尔endElement(XMLEvent事件)引发异常{
EndElement EndElement=event.asEndElement();
字符串名称=endElement.getName().getLocalPart();
如果(PNR.等于(名称)){
返回true;
}
返回false;
}
私有void startDocument(XMLEvent事件){
System.out.println(“解析已启动”);
}
私有void endDocument(XMLEvent事件){
System.out.println(“解析结束”);
}
公共静态void main(字符串[]argv)引发XMLStreamException,异常{
字符串xml=”“;
xml+=“”;
xml+=“3”;
xml+=“阿南德拉奥圈”;
xml+=“甘尼萨神庙”;
xml+=“Ghousia学院”;
xml+=“98798679769”;
xml+=“1200”;
xml+=“efdf”;
xml+=“沃尔沃空调半卧铺(2+2)”;
xml+=“66.19”;
xml+=“2012-10-05”;
xml+=“钦奈”;
xml+=“600.0”;
xml+=“2012-10-04T15:46:45.073+05:30”;
xml+=“1”;
xml+=“1234567890”;
xml+=“测试”;
xml+=“RATPKES44974756”;
xml+=“”;
xml+=“”;
xml+=“66.19”;
xml+=“600.0”;
xml+=“男性”;
xml+=“0”;
xml+=“1234567890”;
xml+=“测试”;
xml+=”
import java.io.StringReader;
import java.util.Iterator;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.XMLStreamReader;
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 ParseXMLStringStAX {
private static final String PNR = "pnr";
private String characters;
public String parse(String xmlString) throws XMLStreamException, Exception {
XMLEventReader reader = null;
try {
if (xmlString == null || xmlString.isEmpty()) {
throw new IllegalArgumentException("Illegal initializiation (xmlString is null or empty)");
}
StringReader stringReader = new StringReader(xmlString);
XMLInputFactory inputFact = XMLInputFactory.newInstance();
XMLStreamReader streamReader = inputFact.createXMLStreamReader(stringReader);
reader = inputFact.createXMLEventReader(streamReader);
while (reader.hasNext()) {
XMLEvent event = reader.nextEvent();
if (event.isCharacters()) {
characters(event);
}
if (event.isStartElement()) {
startElement(event);
// handle attributes
Iterator<Attribute> attributes = event.asStartElement().getAttributes();
while(attributes.hasNext()) {
attribute(attributes.next());
}
}
if (event.isEndElement()) {
// found what we want?
if (endElement(event)) {
endDocument(null);
break;
}
}
if (event.isStartDocument()) {
startDocument(event);
}
if (event.isEndDocument()) {
endDocument(event);
}
}
} catch (XMLStreamException ex) {
throw ex;
} finally {
try {
if (reader != null) {
reader.close();
}
} catch (XMLStreamException ex) {
}
}
return characters;
}
private void attribute(XMLEvent event) throws Exception {
}
private void characters(XMLEvent event) throws Exception {
Characters asCharacters = event.asCharacters();
if (asCharacters.isWhiteSpace())
return;
if (characters == null) {
characters = asCharacters.getData();
} else {
characters += asCharacters.getData();
}
}
private void startElement(XMLEvent event) throws Exception {
StartElement startElement = event.asStartElement();
String name = startElement.getName().getLocalPart();
characters = null;
}
private boolean endElement(XMLEvent event) throws Exception {
EndElement endElement = event.asEndElement();
String name = endElement.getName().getLocalPart();
if (PNR.equals(name)) {
return true;
}
return false;
}
private void startDocument(XMLEvent event) {
System.out.println("Parsing started");
}
private void endDocument(XMLEvent event) {
System.out.println("Parsing ended");
}
public static void main(String[] argv) throws XMLStreamException, Exception {
String xml = "";
xml += "<Ticket>";
xml += " <bookedSeats>3</bookedSeats>";
xml += " <bpAddress>Anand Rao Circle</bpAddress>";
xml += " <bpLandMark>ganesha temple</bpLandMark>";
xml += " <bpLocation> Ghousia College</bpLocation>";
xml += " <bpPhoneNo>98798679769</bpPhoneNo>";
xml += " <bpTime>1200</bpTime>";
xml += " <busServiceName>efdf</busServiceName>";
xml += " <busType>Volvo A/C Semi Sleeper (2+2)</busType>";
xml += " <commission>66.19</commission>";
xml += " <dateOfJourney>2012-10-05</dateOfJourney>";
xml += " <destination>Chennai</destination>";
xml += " <fare>600.0</fare>";
xml += " <issueTime>2012-10-04T15:46:45.073+05:30</issueTime>";
xml += " <noOfSeats>1</noOfSeats>";
xml += " <passengerMobile>1234567890</passengerMobile>";
xml += " <passengerName>Test</passengerName>";
xml += " <pnr>RATPKES44974756</pnr>";
xml += " <seatDetails>";
xml += " <seatDetail>";
xml += " <commission>66.19</commission>";
xml += " <fare>600.0</fare>";
xml += " <gender>MALE</gender>";
xml += " <passengerAge>0</passengerAge>";
xml += " <passengerMobile>1234567890</passengerMobile>";
xml += " <passengerName>Test</passengerName>";
xml += " <prime>false</prime>";
xml += " <seatName>3</seatName>";
xml += " </seatDetail>";
xml += " </seatDetails>";
xml += " <source>Bangalore</source>";
xml += " <status>BOOKED</status>";
xml += " <travelsName>Rajratan Travels</travelsName>";
xml += "</Ticket>";
ParseXMLStringStAX parser = new ParseXMLStringStAX();
String pnr = parser.parse(xml);
System.out.println("--> Result: " + String.valueOf(pnr));
}
}
import java.io.StringReader;
import javax.xml.xpath.*;
import org.xml.sax.InputSource;
public class Demo {
public static void main(String[] args) throws Exception {
String xml = "<?xml version='1.0' encoding='UTF-8'?><Ticket><bookedSeats>3</bookedSeats><bpAddress>Anand Rao Circle</bpAddress><bpLandMark>ganesha temple</bpLandMark><bpLocation> Ghousia College</bpLocation><bpPhoneNo>98798679769</bpPhoneNo><bpTime>1200</bpTime><busServiceName>efdf</busServiceName><busType>Volvo A/C Semi Sleeper (2+2)</busType><commission>66.19</commission><dateOfJourney>2012-10-05</dateOfJourney><destination>Chennai</destination><fare>600.0</fare><issueTime>2012-10-04T15:46:45.073+05:30</issueTime><noOfSeats>1</noOfSeats><passengerMobile>1234567890</passengerMobile><passengerName>Test</passengerName><pnr>RATPKES44974756</pnr><seatDetails><seatDetail><commission>66.19</commission><fare>600.0</fare><gender>MALE</gender><passengerAge>0</passengerAge><passengerMobile>1234567890</passengerMobile><passengerName>Test</passengerName><prime>false</prime><seatName>3</seatName></seatDetail></seatDetails><source>Bangalore</source><status>BOOKED</status><travelsName>Rajratan Travels</travelsName></Ticket>";
XPathFactory xpf = XPathFactory.newInstance();
XPath xpath = xpf.newXPath();
InputSource inputSource = new InputSource(new StringReader(xml));
String pnr = (String) xpath.evaluate("/Ticket/pnr", inputSource, XPathConstants.STRING);
System.out.println(pnr);
}
}
RATPKES44974756