首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > J2EE开发 >

运用dom4j解析xml出错

2013-09-05 
使用dom4j解析xml出错这是我的xml文件?xml version1.0 encoding gbk?rdf:RDF xml:basenari x

使用dom4j解析xml出错
这是我的xml文件

<?xml version="1.0" encoding = "gbk"?>
<rdf:RDF xml:base="nari" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cim="http://iec.ch/TC57/2003/CIM-schema-cim10#" xmlns:cimNARI="http://www.naritech.cn/CIM/ext-schema#">
<cim:SubControlArea rdf:ID="209000001">
        <cim:Naming.name>乐平市供</cim:Naming.name>
        <cimNARI:SubControlArea.areaNo>1</cimNARI:SubControlArea.areaNo>
        <cimNARI:SubControlArea.recordApp>2031647</cimNARI:SubControlArea.recordApp>
        <cimNARI:SubControlArea.MemberOf_ControlArea rdf:resource="#209000007"/>
</cim:SubControlArea>
<cim:SubControlArea rdf:ID="209000002">
        <cim:Naming.name>德兴市</cim:Naming.name>
        <cimNARI:SubControlArea.areaNo>2</cimNARI:SubControlArea.areaNo>
        <cimNARI:SubControlArea.recordApp>2031647</cimNARI:SubControlArea.recordApp>
        <cimNARI:SubControlArea.MemberOf_ControlArea rdf:resource="#209000007"/>
</cim:SubControlArea>
<cim:SubControlArea rdf:ID="209000003">
        <cim:Naming.name>鄱阳县</cim:Naming.name>
        <cimNARI:SubControlArea.areaNo>3</cimNARI:SubControlArea.areaNo>
        <cimNARI:SubControlArea.recordApp>2031647</cimNARI:SubControlArea.recordApp>
        <cimNARI:SubControlArea.MemberOf_ControlArea rdf:resource="#209000007"/>
</cim:SubControlArea>
</rdf:RDF>

我的java代码是

import java.io.File;
import java.util.List;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

public class ReadMyXML2{ 
public static void main(String[] args) throws Exception {
SAXReader saxReader = new SAXReader();
Document doc = saxReader.read(new File("work.xml"));
        Element root = doc.getRootElement();
        List<Element> lstSCA = doc.selectNodes("//*[local-name()='SubControlArea']"); 


        for (Element elem : lstSCA) {
            Attribute attrID = elem.attribute("ID");
            System.out.println(attrID.getName() + "=" + attrID.getText());
            
            Node elemName = elem.selectSingleNode("*[local-name()='Naming.name']"); 
            System.out.println(elemName.getName() + "\t\t" + elemName.getText());
            
           
        }
    }

}


但是他老是报错
 The element type "cim:Naming.name" must be terminated by the matching end-tag "</cim:Naming.name>". Nested exception: The element type "cim:Naming.name" must be terminated by the matching end-tag "</cim:Naming.name>". XML Java dom4j
[解决办法]
头定义修改为 utf-8


import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class XmlReader {

private List<SubControlArea> list = new ArrayList<SubControlArea>();

public void read(){

SAXParserFactory sf = SAXParserFactory.newInstance(); 
SAXParser sax = null;


try {
sax = sf.newSAXParser();

} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}   

try {
//sax.parse("src/work.xml", new DefaultHandler());
sax.parse("src/work.xml", new SAXHander());

} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

for(int i=0;i<list.size();i++){
System.out.println(list.get(i).getRecordApp());
}


}

public class SAXHander extends DefaultHandler{

String currentName = "";
SubControlArea area = null;

@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub

if(name.equals("cim:SubControlArea")){
area = new SubControlArea();
}
if(name.equals("cimNARI:SubControlArea.areaNo")){
currentName = name;
}else{
currentName = "";
}


}

@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
String textContent = new String(ch, start, length);  
if((textContent.trim().equals("")==false) && textContent!=null && currentName.equals("cimNARI:SubControlArea.areaNo")){
area.setRecordApp(textContent);
}else{

}
}

@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
// TODO Auto-generated method stub
if(name.equals("cim:SubControlArea")){
list.add(area);
}
}




}

private class SubControlArea{

private String name;
private String areaNo;
private String recordApp;
private String MemberOf_ControlArea;
public String getName() {


return name;
}
public void setName(String name) {
this.name = name;
}
public String getAreaNo() {
return areaNo;
}
public void setAreaNo(String areaNo) {
this.areaNo = areaNo;
}
public String getRecordApp() {
return recordApp;
}
public void setRecordApp(String recordApp) {
this.recordApp = recordApp;
}
public String getMemberOf_ControlArea() {
return MemberOf_ControlArea;
}
public void setMemberOf_ControlArea(String memberOf_ControlArea) {
MemberOf_ControlArea = memberOf_ControlArea;
}

}

public static void main(String[] args) {

XmlReader reader = new XmlReader();
reader.read();

}


}


[解决办法]
对于需要自己编写代码来处理 XML 文档的开发人员来说,选择 DOM 还是 SAX 解析模型是一个非常

重要的设计决策。 
  DOM 采用建立树形结构的方式访问 XML 文档,而 SAX 采用的事件模型。 
  DOM 解析器把 XML 文档转化为一个包含其内容的树,并可以对树进行遍历。用 DOM 解析模型的优点

是编程容易,开发人员只需要调用建树的指令,然后利用navigation APIs访问所需的树节点来完成任务

。可以很容易的添加和修改树中的元素。然而由于使用 DOM 解析器的时候需要处理整个 XML 文档,所以

对性能和内存的要求比较高,尤其是遇到很大的 XML 文件的时候。由于它的遍历能力,DOM 解析器常用

于 XML 文档需要频繁的改变的服务中。 
  SAX 解析器采用了基于事件的模型,它在解析 XML 文档的时候可以触发一系列的事件,当发现给定

的tag的时候,它可以激活一个回调方法,告诉该方法制定的标签已经找到。SAX 对内存的要求通常会比

较低,因为它让开发人员自己来决定所要处理的tag。特别是当开发人员只需要处理文档中所包含的部分

数据时,SAX 这种扩展能力得到了更好的体现。但用 SAX 解析器的时候编码工作会比较困难,而且很难

同时访问同一个文档中的多处不同数据。 



由于楼主的xml文件很大,采用sax,jaxp之类的解析。

热点排行