[英]Issue in parsing an XML in JSP
我正在嘗試使用DOM方法在JSP中解析XML。 下面是XML:
<?xml version="1.0" encoding="UTF-8"?>
<apis xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'>
<api name="getFormFields" requesttype ="GET">
<url>/fieldtype/</url>
<parameters>
<parameter><![CDATA[fieldtype=textbox&fieldId=8668376496495]]></parameter>
</parameters>
</api>
</apis>
我想讀取<parameters>
標記,顯示參數值,但不能這樣做。 以下是我正在使用的JSP。 該JSP顯示URL, <api>
name
和requesttype
。 我還想要<parameters>
並單擊“提交”,我想將此數據發送到腳本。 我沒有這樣做。
<%@page contentType="text/html;charset=UTF-8"%>
<%@page pageEncoding="UTF-8"%>
<%@ page session="false" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<%@page import="org.w3c.dom.*, javax.xml.parsers.* ,java.io.File,java.util.*, javax.servlet.http.*"%>
<%
DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = docFactory.newDocumentBuilder();
Document doc = docBuilder.parse(new File(
"C:\\Documents and Settings\\Desktop\\apc.xml"));
%>
<%!
public boolean isTextNode(Node n){
return n.getNodeName().equals("#text");
}
%>
<html>
<head>
<META http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title><fmt:message key="welcome.title"/></title>
<link rel="stylesheet" href="<c:url value="/resources/blueprint/screen.css" />" type="text/css" media="screen, projection">
<link rel="stylesheet" href="<c:url value="/resources/blueprint/print.css" />" type="text/css" media="print">
</head>
<body>
<script type="text/javascript">
var xmlStr="\n";
function showData()
{
alert('here');
xmlStr="\n";
var pageNumber;
if(document.forms[0].services[0].checked||document.forms[0].services[1].checked)
{
if(document.forms[0].services[1].checked)
{
alert(document.forms[0].services[0].checked);
var urlData = document.getElementById('urlData').value;
alert(urlData);
}
}
}
</script>
<form name="myForm">
<h2><font color='green'>List of Service Api</font></h2>
<table border="2">
<tr>
<th>Methods</th>
<th>Request Type</th>
<th>URL</th>
</tr>
<%
doc.getDocumentElement().normalize();
Element element = doc.getDocumentElement();
NodeList apiNodes = element.getChildNodes();
for (int i=0; i<apiNodes.getLength(); i++){
Node nodeApi = apiNodes.item(i);
if (isTextNode(nodeApi))
continue;
NodeList url = nodeApi.getChildNodes();
%>
<tr>
<td>
<input type="hidden" name="apiNames" value="<%= apiNodes.item(i).getAttributes().item(0) %>"/>
<input type="radio" name="services" value="0"><%= apiNodes.item(i).getAttributes().item(0) %></td>
<td><input type="hidden" name="requestType" value="<%= apiNodes.item(i).getAttributes().item(1) %>"/><%= apiNodes.item(i).getAttributes().item(1) %></td>
<%
for (int j=0; j<url.getLength(); j++ ){
Node node = url.item(j);
if ( isTextNode(node))
continue;
%>
<td><input type="hidden" name="urlData" value="<%= node.getFirstChild().getNodeValue() %>"/><%= node.getFirstChild().getNodeValue() %></td>
<%
}
%>
</tr>
<br>
<%
}
%>
<td> <button name="SubmitRequest" onclick="showData();">Submit Request</button></td>
</table>
<textarea name="response" cols="150" rows="120"></textarea>
</form>
</body>
</html>
使用純DOM遍歷解析XML文件始終很麻煩。 例如,使用JAXB可以避免這種情況。
但是,如果您確實願意,我建議嘗試a)使用其名稱而不是使用它們在DOM樹中的位置來訪問XML標簽,以及b)使用getContextText()
訪問內容。 這對於相當簡單的XML文件來說效果很好。 您可以在下面找到一個示例,然后其他值類似:
<%
NodeList apis = doc.getElementsByTagName("api");
for (int i=0; i < apis.getLength(); i++) {
Element api = (Element) apis.item(i); //the cast works if you really used a tag name in getElementsByTagName()
Element url = (Element) api.getElementsByTagName("url").item(0);
String urlContent = url.getTextContext().trim(); //trim gets rid of nasty whitespace like \n
%>
<td><input type="hidden" name="urlData" value="<%=urlContent%>"/><%=urlContent%></td>
<%
}
%>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.