gpt4 book ai didi

java - 从java输入流中获取xml信息

转载 作者:行者123 更新时间:2023-12-01 14:04:37 25 4
gpt4 key购买 nike

我有一个从输入流读取 xml 的程序,这是 inputStream 的结果

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetRouteSummaryForStopResponse xmlns="http://octranspo.com">
<GetRouteSummaryForStopResult>
<StopNo xmlns="http://tempuri.org/">string</StopNo>
<StopDescription
xmlns="http://tempuri.org/">string</StopDescription>
<Error xmlns="http://tempuri.org/">string</Error>
<Routes xmlns="http://tempuri.org/">
<Route>
<RouteNo>int</RouteNo>
<DirectionID>int</DirectionID>
<Direction>string</Direction>
<RouteHeading>string</RouteHeading>
</Route>
<Route>
<RouteNo>int</RouteNo>
<DirectionID>int</DirectionID>
<Direction>THIS IS A STRING</Direction>
<RouteHeading>string</RouteHeading>
</Route>
</Routes>
</GetRouteSummaryForStopResult>
</GetRouteSummaryForStopResponse>
</soap:Body>
</soap:Envelope>

我不知道从哪里开始获取 xml 中的方向信息。

public String HTTPrequest(String stopNo){
String parameterURL = "appID="+this.appId+"&apiKey="+this.AppKey+"&routeNo=1&stopNo="+stopNo+"";
URL url;
HttpURLConnection connection = null;
try {
url = new URL(this.requestGetRouteSummaryForStop);
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(parameterURL.getBytes().length));
connection.setUseCaches (false);

//send request
DataOutputStream wr = new DataOutputStream (
connection.getOutputStream ());
wr.writeBytes (parameterURL);
wr.flush ();
wr.close ();

//Get Response

InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
StringBuffer response = new StringBuffer();
while((line = rd.readLine()) != null) {
response.append(line);
response.append('\r');
}
rd.close();
System.out.print(response.toString());
return response.toString();
} catch (Exception e) {
System.out.print("ERROR: ");
e.printStackTrace();
return null;
}finally{
if(connection != null){
connection.disconnect();
}
}
}


public void parseXmlData(String response){
InputSource xmlSource = new InputSource(new StringReader(response));
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse(xmlSource);

XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath();

String routeHeading = xPath.evaluate("/GetRouteSummaryForStopResponse/GetRouteSummaryForStopResult/Routes/Route/Direction",document);
System.out.print("RouteHeading: "+ routeHeading);
} catch (Exception e) {
e.printStackTrace();
}
}

这是解析 xml 并连接到主机的代码

___________________:编辑:_____________________

    public InputStream HTTPrequest(String stopNo){
String parameterURL = "appID="+this.appId+"&apiKey="+this.AppKey+"&routeNo=1&stopNo="+stopNo+"";
URL url;
HttpURLConnection connection = null;
try {
url = new URL(this.requestGetRouteSummaryForStop);
connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("charset", "utf-8");
connection.setRequestProperty("Content-Length", "" + Integer.toString(parameterURL.getBytes().length));
connection.setUseCaches (false);

//send request
DataOutputStream wr = new DataOutputStream (
connection.getOutputStream ());
wr.writeBytes (parameterURL);
wr.flush ();
wr.close ();

//Get Response

InputStream is = connection.getInputStream();
return is;
} catch (Exception e) {
System.out.print("ERROR: ");
e.printStackTrace();
return null;
}finally{
if(connection != null){
connection.disconnect();
}
}
}


public void parseXmlData(InputStream response){
InputStream is = response;

try {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
Document doc = dbf.newDocumentBuilder().parse(is);

XPathFactory xf = XPathFactory.newInstance();
XPath xPath = xf.newXPath();

// Find direction ANY where within the document...

XPathExpression xExp = xPath.compile("//DirectionID");
NodeList nl = (NodeList) xExp.evaluate(doc, XPathConstants.NODESET);
for (int index = 0; index < nl.getLength(); index++) {
Node node = nl.item(index);
System.out.println(node.getTextContent());
}

// Find the direction node's any where in the document
// where it's a child of Route, which has a child
// node called RouteNo with the text value of 'int'...
xExp = xPath.compile("//Route[RouteNo = 'int']/Direction");
nl = (NodeList) xExp.evaluate(doc, XPathConstants.NODESET);
for (int index = 0; index < nl.getLength(); index++) {
Node node = nl.item(index);
System.out.println(node.getTextContent());
}

} catch (Exception exp) {
exp.printStackTrace();
}
}

它给了我一个错误

[Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 1; Premature end of file.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at OcTranspoConnect.parseXmlData(OcTranspoConnect.java:82)
at OcTranspoConnect.main(OcTranspoConnect.java:29)

最佳答案

你有两个选择开始......

你可以

将 XML 加载到文档对象模型中。这允许您完全访问 XML 来查询它(并可能修改它)。

如果您需要进行多次处理或希望在 DOM 加载到内存中并始终可用时对数据进行多次查询,这非常有用。

如果 XML 文件很大,那就不太好,因为 DOM 需要相当多的内存

DOM 方法使您能够使用 XPath支持。 XPath 是 XML 的查询 API(甚至可以用于结构良好的 HTML)

参见Document Object Model了解更多详细信息。

你可以

使用 SAX 解析器在加载 XML 文档时对其进行处理。这提供了回调方法/事件,当解析过程中的某些内容引发它们时,这些方法/事件将被调用。

当文档很大或者您只需要对文档进行一次处理(例如构建您自己的文档对象表示形式)时,这非常有用。

它不太适合多遍处理或交互式查询。

看看Simple API for XML了解更多详情

使用 XPath 示例进行了更新

虽然我确信处理命名空间很容易,但对我来说,它只是阻碍。

以下是两个 XPath 查询的简单示例,用于查找您问题的文档中的所有 Direction 节点

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class XPathTest {

public static void main(String[] args) {

InputStream is = null;

try {
is = new FileInputStream("Soap.xml");

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(false);
Document doc = dbf.newDocumentBuilder().parse(is);

XPathFactory xf = XPathFactory.newInstance();
XPath xPath = xf.newXPath();

// Find direction ANY where within the document...

XPathExpression xExp = xPath.compile("//Direction");
NodeList nl = (NodeList) xExp.evaluate(doc, XPathConstants.NODESET);
for (int index = 0; index < nl.getLength(); index++) {
Node node = nl.item(index);
System.out.println(node.getTextContent());
}

// Find the direction node's any where in the document
// where it's a child of Route, which has a child
// node called RouteNo with the text value of 'int'...
xExp = xPath.compile("//Route[RouteNo = 'int']/Direction");
nl = (NodeList) xExp.evaluate(doc, XPathConstants.NODESET);
for (int index = 0; index < nl.getLength(); index++) {
Node node = nl.item(index);
System.out.println(node.getTextContent());
}

} catch (ParserConfigurationException | SAXException | IOException | XPathExpressionException exp) {
exp.printStackTrace();
}
}
}

这输出...

string
THIS IS A STRING
string
THIS IS A STRING

关于java - 从java输入流中获取xml信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19017176/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com