[求助]Dom4j解析XML问题

heliangtai 2008-07-09 04:04:35
我想把如下的xml:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<persons>
<person>
<name age="24" sex="男">何良太</name>
<company addr="浙江杭州西湖区黄姑山路3号" othername="永程科技股份公司">浙江西安交大龙山软件公司</company>
<school addr="安徽省巢湖市" master="张三">巢湖学院</school>
</person>
<person>
<name age="20" sex="女">张红燕</name>
<company addr="北京市东城区四环外线" othername="中国移动">中国移动通信有限公司</company>
<school addr="安徽省芜湖市" master="李四">安徽师范大学</school>
</person>
</persons>
</root>

解析成:
name=何良太,age=24,sex=男.
company=浙江西安交大龙山软件公司,addr=浙江杭州西湖区黄姑山路3号,othername=永程科技股份公司.
school=巢湖学院,addr=安徽省巢湖市,master=张三.
----------------------------------------------------------------------------------
name=张红燕,age=20,sex=女.
company=中国移动通信有限公司,addr=北京市东城区四环外线",othername=中国移动.
school=安徽师范大学,addr=安徽省芜湖市,master=李四.
==================================================================================
遇到的问题:1、解析完一个标签后不能马上解析这个标签的属性
2、company与school里都有addr属性,如何处理
希望大家帮助,谢谢!
...全文
213 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ou_yangpengfei 2009-05-13
  • 打赏
  • 举报
回复
学习
heliangtai 2008-07-12
  • 打赏
  • 举报
回复
谢谢,问题已解决,我用的方法比较土,没有四楼的好,以后应该多来发问。四楼的解析教会了一些东西,真诚的谢谢!
我自己的解决方案的主要代码如下:(通过遍历现实的)
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(Thread.currentThread().getContextClassLoader().getResourceAsStream(filename));

//使用绝对路径
//List elementList=document.selectNodes("root/persons/person");

//使用相对路径
List elementList=document.selectNodes("//person");
Iterator iterator=elementList.iterator();
while(iterator.hasNext()){
Element element=(Element)iterator.next();

//遍历下面的name节点的值与属性
Iterator nameIterator=element.elementIterator("name");
while(nameIterator.hasNext()){
Element attributeElement=(Element)nameIterator.next();
System.out.println("name="+attributeElement.getText());
System.out.println("age="+attributeElement.attributeValue("age"));
System.out.println("sex="+attributeElement.attributeValue("sex"));
}

//遍历下面的company节点的值与属性
Iterator companyIterator=element.elementIterator("company");
while(companyIterator.hasNext()){
Element attributeElement=(Element)companyIterator.next();
System.out.println("公司名称="+attributeElement.getText());
System.out.println("公司地址="+attributeElement.attributeValue("addr"));
System.out.println("公司别名="+attributeElement.attributeValue("othername"));
}

//遍历下面的school节点的值与属性
Iterator schoolIterator=element.elementIterator("school");
while(schoolIterator.hasNext()){
Element attributeElement=(Element)schoolIterator.next();
System.out.println("毕业学校="+attributeElement.getText());
System.out.println("学期地址="+attributeElement.attributeValue("addr"));
System.out.println("大学校长="+attributeElement.attributeValue("master"));
}
System.out.println("=========================================");

}
whetu 2008-07-09
  • 打赏
  • 举报
回复
4楼说的很详细了,school和company是分开解析处理的 ,所以 lz不用考虑他们的属性重复怎么处理。
laorer 2008-07-09
  • 打赏
  • 举报
回复
xpath不就可以吗?
imA 2008-07-09
  • 打赏
  • 举报
回复
package dom4j.test;

import java.io.FileInputStream;
import java.io.FileNotFoundException;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class Test {

/**
* @param args
* @throws DocumentException
* @throws FileNotFoundException
*/
public static void main(String[] args) throws FileNotFoundException, DocumentException {
// TODO Auto-generated method stub
Document document=parse();
Element root=document.getRootElement();
java.util.List persons=root.elements("person");
System.out.println(persons.size());
for(java.util.Iterator i=root.elementIterator();i.hasNext();){
Element person=(Element)i.next();
Element name=person.element("name");
Element company=person.element("company");
Element school=person.element("school");
System.out.println("name="+name.getData()+",age="+name.attributeValue("age")+",sex="+name.attributeValue("sex"));
System.out.println("company="+company.getData()+",addr="+company.attributeValue("addr")+",othername="+company.attributeValue("othername"));
System.out.println("school="+school.getData()+",addr="+school.attributeValue("addr")+",master="+school.attributeValue("master"));
}
}
public static Document parse() throws DocumentException, FileNotFoundException {
SAXReader reader = new SAXReader();
FileInputStream in=new FileInputStream("persons.xml");
Document document = reader.read(in);
return document;
}

}

其中我把你的xml文件的root元素去掉了(主要是嫌麻烦),变成一下:
<?xml version="1.0" encoding="UTF-8"?>
<persons>
<person>
<name age="24" sex="男">何良太 </name>
<company addr="浙江杭州西湖区黄姑山路3号" othername="永程科技股份公司">浙江西安交大龙山软件公司 </company>
<school addr="安徽省巢湖市" master="张三">巢湖学院 </school>
</person>
<person>
<name age="20" sex="女">张红燕 </name>
<company addr="北京市东城区四环外线" othername="中国移动">中国移动通信有限公司 </company>
<school addr="安徽省芜湖市" master="李四">安徽师范大学 </school>
</person>
</persons>


如果你需要自己加上,程序上只是多了一个层次而已
heliangtai 2008-07-09
  • 打赏
  • 举报
回复
楼上的回答不是我想要的,我是要Dom4j解决
logonin 2008-07-09
  • 打赏
  • 举报
回复
String addr =school.getAttributes().getNamedItem("addr").getNodeValue();应该可以获得属性
<?xml version="1.0" encoding="gb2312"?>
<notes>
<note date="2007-4-12">
<from>小红</from>
<to>小林</to>
<message>周末一起去吃火锅呀</message>
</note>
</notes>




import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;


class JieXiXML
{
public static void main(String[] args)
{
try{
DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();

DocumentBuilder builder=factory.newDocumentBuilder();

File f=new File("note.xml");

InputStream is=new FileInputStream(f);

Document doc=builder.parse(is);

Element root=doc.getDocumentElement();

NodeList notes=root.getChildNodes();

for(int i=0;i<notes.getLength();i++)
{

Node note=notes.item(i);

if(note.getNodeType()==Node.ELEMENT_NODE)

{
String date =note.getAttributes().getNamedItem("date").getNodeValue();

System.out.println(date);

for(Node node=note.getFirstChild();node!=null;node=node.getNextSibling())
{
if(node.getNodeType()==Node.ELEMENT_NODE)
{
if(node.getNodeName().equals("from"))
{
String from=node.getFirstChild().getNodeValue();
System.out.println(from);
}
if(node.getNodeName().equals("to"))
{
String to=node.getFirstChild().getNodeValue();
System.out.println(to);
}
if(node.getNodeName().equals("message"))
{
String message=node.getFirstChild().getNodeValue();
System.out.println(message);
}
}
}
}
}
}
catch(ParserConfigurationException e)
{
e.printStackTrace();
}
catch(SAXException e)
{
e.printStackTrace();
}
catch(IOException e)
{
e.printStackTrace();
}
}
}

67,515

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧