当前位置: 代码迷 >> Java Web开发 >> [求助]如何用JDom创建xml格式的文本
  详细解决方案

[求助]如何用JDom创建xml格式的文本

热度:208   发布时间:2006-12-22 16:26:47.0
[求助]如何用JDom创建xml格式的文本

请问下面这段xml如何用JDom创建?
谢谢!
<?xml version=\"1.0\" encoding=\"gb2312\"?>
<user>
<student>
<id>1</id>
<name>aa</name>
<score>100</score>
</student>
<student>
<id>2</id>
<name>bb</name>
<score>90</score>
</student>
</user>

------------------------------------

我现在不明白的就是有二个相同的student元素,
那是不是要用Element创建二个名为student的实例呢?

------------------------------------



搜索更多相关主题的帖子: xml  JDom  student  文本  score  

----------------解决方案--------------------------------------------------------

建议你看看JAVA里面XML的API

用它很容易实现的


----------------解决方案--------------------------------------------------------
我看了,也试了办天了。。真没试出来才问的

如果不是有二个student我就会创建

但是有二个student的话,我要用Element实例二个student不成的。。。

能把我不明白的关键地方给我点儿提示吗?

----------------解决方案--------------------------------------------------------

[CODE]/*
* UserServiceImpl.java
*
* Created on 2006.11.14
*
* To change this template, choose Tools | Template Manager
* and open the template in the editor.
*/
package net.vlinux.book.orm;
import net.vlinux.book.service.*;
import net.vlinux.book.pojo.*;
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.*;
import java.util.*;
import java.text.*;
import java.io.*;
/**
*
* @author lbf
*/
public class UserServiceImpl implements UserService {

private File file;
private DocumentBuilder builder;
private Transformer transformer;
public UserServiceImpl(){
initOther();
}
private void initOther(){
try{
file=new File("user.xml");
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
builder=factory.newDocumentBuilder();
TransformerFactory tFactory =TransformerFactory.newInstance();
transformer = tFactory.newTransformer();
} catch(Exception exe){
exe.printStackTrace();
}
}
private Document getDocument(){
Document doc=null;
try{
if(file.exists()){
doc=builder.parse(file);
}else{
doc=builder.newDocument();
}
} catch(Exception exe){
exe.printStackTrace();
}
return doc;
}
private void saveDocment(Document doc){
try{
DOMSource source = new DOMSource(doc);
StreamResult result = new StreamResult(file);
transformer.transform(source, result);
} catch(Exception exe){
exe.printStackTrace();
}
}
private Vector<User> getAllUsers(){
Vector<User> users=new Vector<User>();
Document doc=this.getDocument();
Element root=doc.getDocumentElement();
if(root!=null){
NodeList list=root.getElementsByTagName("user");
for(int i=0;i<list.getLength();i++){
Element node=(Element)list.item(i);
User u=new User();
u.setId(Long.parseLong(node.getAttribute("id")));
Element name=(Element)(node.getElementsByTagName("name").item(0));
Text nameText=(Text)(name.getFirstChild());
u.setUsername(nameText.getNodeValue());
Element pwd=(Element)(node.getElementsByTagName("pwd").item(0));
Text pwdText=(Text)(pwd.getFirstChild());
u.setPassword(pwdText.getNodeValue());
Element email=(Element)(node.getElementsByTagName("email").item(0));
Text emailText=(Text)(email.getFirstChild());
u.setEmail(emailText.getNodeValue());
users.add(u);
}
}
return users;
}
public boolean removeUser(User user){
Document doc=this.getDocument();
Element root=doc.getDocumentElement();
if(root!=null){
NodeList list=root.getElementsByTagName("user");
for(int i=0;i<list.getLength();i++){
Element node=(Element)list.item(i);
long id=Long.parseLong(node.getAttribute("id"));
if(user.getId()==id){
root.removeChild(node);
this.saveDocment(doc);
return true;
}
}
}
return false;
}
public void save(User user) {
Document doc=this.getDocument();
Element ele=doc.getDocumentElement();
if(ele==null){
ele=doc.createElement("users");
doc.appendChild(ele);
}
Element u=doc.createElement("user");
u.setAttribute("id",""+user.getId());
Element name=doc.createElement("name");
Element pwd=doc.createElement("pwd");
Element email=doc.createElement("email");
Text nameText=doc.createTextNode(user.getUsername());
Text pwdText=doc.createTextNode(user.getPassword());
Text emailText=doc.createTextNode(user.getEmail());
name.appendChild(nameText);
pwd.appendChild(pwdText);
email.appendChild(emailText);
u.appendChild(name);
u.appendChild(pwd);
u.appendChild(email);
ele.appendChild(u);
this.saveDocment(doc);
}
public User login(String username, String password) {
Vector<User> users=this.getAllUsers();
for(User u:users){
if(u.getUsername().equals(username)&&u.getPassword().equals(password)){
return u;
}
}
return null;
}

public User changePWD(String username, String password) {
Document doc=this.getDocument();
Element root=doc.getDocumentElement();
if(root!=null){
NodeList list=root.getElementsByTagName("user");
for(int i=0;i<list.getLength();i++){
Element node=(Element)list.item(i);
User u=new User();
u.setId(Long.parseLong(node.getAttribute("id")));
Element name=(Element)(node.getElementsByTagName("name").item(0));
Text nameText=(Text)(name.getFirstChild());
u.setUsername(nameText.getNodeValue());
Element pwd=(Element)(node.getElementsByTagName("pwd").item(0));
Text pwdText=(Text)(pwd.getFirstChild());
u.setPassword(pwdText.getNodeValue());
Element email=(Element)(node.getElementsByTagName("email").item(0));
Text emailText=(Text)(email.getFirstChild());
u.setEmail(emailText.getNodeValue());
if(u.getUsername().equals(username)){
Element pwdNew=doc.createElement("pwd");
Text pwdNewText=doc.createTextNode(password);
pwdNew.appendChild(pwdNewText);
node.replaceChild(pwdNew,pwd);
this.saveDocment(doc);
u.setPassword(password);
return u;
}
}
}
return null;
}

public static void main(String[] args) {
UserServiceImpl us=new UserServiceImpl();

}

}[/CODE]

这是我以前写的一个东西,你可以参考一下


----------------解决方案--------------------------------------------------------
谢谢,不过怎么这么多呀?

你会用JDom吗?
用JDom超简单的几行就OK了。。



----------------解决方案--------------------------------------------------------
如果有一个你会写么?
两个和一个没区别啊
----------------解决方案--------------------------------------------------------

有区别。因为不能建重名的Element,


----------------解决方案--------------------------------------------------------
怎么会不能建同名的呢
Document doc=this.getDocument();//先得到顶层的文档
Element ele=doc.getDocumentElement();
if(ele==null){
ele=doc.createElement("users");
doc.appendChild(ele);
}
Element u=doc.createElement("user");
u.setAttribute("id",""+user.getId());
Element name=doc.createElement("name");
Element pwd=doc.createElement("pwd");
Element email=doc.createElement("email");
Text nameText=doc.createTextNode(user.getUsername());
Text pwdText=doc.createTextNode(user.getPassword());
Text emailText=doc.createTextNode(user.getEmail());
name.appendChild(nameText);
pwd.appendChild(pwdText);
email.appendChild(emailText);
u.appendChild(name);
u.appendChild(pwd);
u.appendChild(email);
ele.appendChild(u);//用这种方法啊,当然可以了

----------------解决方案--------------------------------------------------------
以下是引用limaoyuan在2006-12-22 16:50:12的发言:

有区别。因为不能建重名的Element,

JDOM我不了解,但是用JAVA的API是可以写出来的

其实JAVA的API也不复杂,只要几句就可以了.并且条理很清楚
----------------解决方案--------------------------------------------------------

Element student = doc.createElement("student");
Element id = doc.createElement("id");
student.appendChild(id);
Text tId = doc.createTextNode("...");
id.appendChild(tId);

Element name= doc.createElement("name");
student.appendChild(name);
Text tName= doc.createTextNode("...");
name.appendChild(tName);

Element score = doc.createElement("score");
student.appendChild(score);
Text tScore= doc.createTextNode("...");
score.appendChild(tScore);
然后把student加到跟接点上。
之后
student = doc.createElement("student");
id = doc.createElement("id");
student.appendChild(id);
....
最后也要把把student加到跟接点上

下面都是这样,这跟你加一个STUDENT结点是没区别的。只不过用复用了变量。
如果你喜欢你大可以定义两个变量名,不过是多余而已!


----------------解决方案--------------------------------------------------------
  相关解决方案