Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过stAX或SAX从xml字符串获取特定事件/属性内容_Java_Xml_Parsing_Sax_Stax - Fatal编程技术网

Java 如何通过stAX或SAX从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

我有一个xml POST响应,作为字符串接收。我需要特定“pnr”(见xml)的内容将其传递给另一个GET请求。 我正在尝试sax和stAX来实现这一点,但失败得很惨。 我使用了getElementsByTagName和getAttribute,但没有go。。。 这是我的代码,稍后是我收到的xml字符串

任何形式的帮助都是一份礼物

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