获取XML下的所有节点(父节点及子节点)
<Structure><docctrltype="C001"typetext=""><docctrltype="C002"types=""typetext=""></do...
<Structure>
<docctrl type="C001" typetext="">
<docctrl type="C002" types="" typetext=""></docctrl>
<docctrl type="C003" types="" typetext="">
<doc type="C004" types="" typetext=""></docctrl>
<docl type="C005" types="" typetext="">
<ctrl type="C006" types="" typetext=""></ctrl>
<ctrl type="" types="" typetext=""></ctrl>
</doc>
</docctrl>
</docctrl>
</Structure>
要获取<Structure></Structure>节点下得所有节点,不只是子节点,还有子节点下的节点<docctrl></docctrl>、<doc></doc>、<ctrl><ctrl> 中的“type”属性值;
此种要求如何才能得到;
或者就是通过传递一个“type”值,如C004,怎样匹配到XML下的对应节点,并找到它的父节点 展开
<docctrl type="C001" typetext="">
<docctrl type="C002" types="" typetext=""></docctrl>
<docctrl type="C003" types="" typetext="">
<doc type="C004" types="" typetext=""></docctrl>
<docl type="C005" types="" typetext="">
<ctrl type="C006" types="" typetext=""></ctrl>
<ctrl type="" types="" typetext=""></ctrl>
</doc>
</docctrl>
</docctrl>
</Structure>
要获取<Structure></Structure>节点下得所有节点,不只是子节点,还有子节点下的节点<docctrl></docctrl>、<doc></doc>、<ctrl><ctrl> 中的“type”属性值;
此种要求如何才能得到;
或者就是通过传递一个“type”值,如C004,怎样匹配到XML下的对应节点,并找到它的父节点 展开
2个回答
展开全部
本方案用来解决XML根据父节点的属性得到指定子节点的属性的值
需要的jar包:
本方案的xml结构为以下格式:看图
package com.itqingyou.xml;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class CityXMLServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
@SuppressWarnings("unchecked")
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/xml;charset=utf-8");// 发送xml这里要修改
/*
* 获取省份名称,加载该省对应的<province>元素 把元素转换成字符串发送非客户端
*
* 1.获取省份名称 2.使用省份名称查找对应的<prouince>元素 3.再把<province>元素转换成字符串发送!
*
*/
try {
/*
* 得到Document
*/
SAXReader reader = new SAXReader();
InputStream input = this.getClass().getResourceAsStream("/China.xml");
Document doc = reader.read(input);
/*
* 获取参数
*/
String pname = request.getParameter("pname");// 获取省份名称
System.out.println(pname);
// Element proEle =
// (Element)doc.selectSingleNode("//province[@name='"+pname+"']"+"//city[]");
Element proEle = (Element) doc.selectSingleNode("//province[@name='" + pname + "']");
// List<Attribute> arrList =
// doc.selectNodes("//province[@name="+pname+"']/city/@name");
////这里是重点指定父节点后,再得到字节点的指定属性
List<Attribute> arrList = doc.selectNodes("//province[@name='" + pname + "']/" + "city/@name");
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arrList.size(); i++) {
sb.append(arrList.get(i).getValue());// 把每个属性的值存放到sb中
if (i < arrList.size() - 1) {
sb.append(",");
}
}
response.getWriter().print(sb);
System.out.println(sb);
// String value = arrList.get(1).getValue();
// System.out.println(value);
String asXML = proEle.asXML();// 把元素转换成字符串
// System.out.println(asXML);
// response.getWriter().print(asXML);
} catch (DocumentException e) {
e.printStackTrace();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
id:清幽
需要jar包可以回复我
展开全部
XmlDocument xmlDoc = new XmlDocument();
// 载入xml文件
xmlDoc.Load("1.xml");
// 找到type='C004'的doc节点
XmlNode node = xmlDoc.SelectSingleNode("//doc[@type='C004']");
// 找到doc的父节点
XmlNode pnode = node.ParentNode;
遍历节点:
foreach (XmlNode nd in xmlDoc.DocumentElement.ChildNodes)
{ // nd 遍历所有docctrl节点
if (nd.hasChildNodes)
{
foreach (XmlNode n in nd.ChildNodes)
{ // n 遍历所有doc和ctrl节点
string stype = n.Attributes["type"].Value;
string s = n.InnerText; // 节点的值
}
}
}
// 载入xml文件
xmlDoc.Load("1.xml");
// 找到type='C004'的doc节点
XmlNode node = xmlDoc.SelectSingleNode("//doc[@type='C004']");
// 找到doc的父节点
XmlNode pnode = node.ParentNode;
遍历节点:
foreach (XmlNode nd in xmlDoc.DocumentElement.ChildNodes)
{ // nd 遍历所有docctrl节点
if (nd.hasChildNodes)
{
foreach (XmlNode n in nd.ChildNodes)
{ // n 遍历所有doc和ctrl节点
string stype = n.Attributes["type"].Value;
string s = n.InnerText; // 节点的值
}
}
}
更多追问追答
追问
我是只要C004的父节点C003 ,其它不要,有办法么
追答
上面给出来了:
XmlDocument xmlDoc = new XmlDocument();
// 载入xml文件
xmlDoc.Load("1.xml");
// 找到type='C004'的doc节点
XmlNode node = xmlDoc.SelectSingleNode("//doc[@type='C004']");
// 找到doc的父节点 <---- 这个就是C003节点
XmlNode pnode = node.ParentNode;
pnode就是你要找的。你可以就选上面的代码,遍历那一段都不要了。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询