Java解析rdf和xml⽂件以及处理excel
⼀.Java解析rdf⽂件
1.下载jena库
⾸先,从下载 jena 包 apache-jana-2.7.*.(我⽤的是2.7)。解压。
打开 Eclipse,新建⼀个Java Project。
右键点击项⽬->properties->Java Build Path -> libraries。将解压后 lib ⽬录下的 jar ⽂件添加到build path 中。
OK。现在可以在项⽬⾥使⽤ jena 了。
2.jean中的数据结构
在 Jena 中,资源⽤ Resource 类来表⽰,其属性⽤ Property 类来表⽰。⽽整体模型⽤Model 类来表⽰。⼀个 Model 对象可以包含多个资源。每⼀个资源⼜包括主语subject、谓语predicate、客体object来表⽰(下⾯是⼀个记录车辆移动数据的rdf⽂件)。
其中整个rdf⽂件可以看做是⼀个model,每个rdf标签可以看做是⼀个subject,每个rdf标签下的obs:hasxxx可以看做是predictate,每个<obs>xxx</obs>中间的xxx看做是object。整个解析类似xml。
3.使⽤jean
//获取model
public static Model readRDF(String fileName) {
Model model = ateDefaultModel();
InputStream in = ().open(fileName);
if (in == null) {
throw new IllegalArgumentException("File: " + fileName
+ " not found");
}
// 读取RDF/XML ⽂件
ad(in, com.hp.hpl.jena.URI(), "RDF/XML-ABBREV");
// model.write(System.out);
}
* 获取经纬度以及发送者ID
* @param model 数据
* @param list 存储结果
*/
public static void getWantedItems(Model model,
Map<String, List<Map<String, String>>> senderMap, HashSet<String> nameSet) {
ResIterator subjects = model.listSubjects();
while (subjects.hasNext()) {
Resource subject = ();
//Property property = ateProperty();
//System.out.LocalName());
StmtIterator properties = subject.listProperties();
Map<String, String> item = new HashMap<String, String>();
String sender = null;
while (properties.hasNext()) {
Statement stmt = Statement();
Property predicate = Predicate();
RDFNode object = Object();
String val = null;
String name = LocalName().trim();
//System.out.println(name);
val = String().split("\\^\\^")[0];
if (name.equals("hasLongitude")) {
item.put("longitude", val);
} else if (name.equals("hasLatitude")) {
item.put("latitude", val);
} else if (name.equals("hasSender")) {
sender = im();
item.put("sender", val);
nameSet.add(sender);
}
//System.out.println();
}
if ((sender)!=null) {
<(sender).add(item);
}else {
System.out.println("新车id:"+sender+"创建list成功");
List<Map<String, String>> list = new ArrayList<Map<String,String>>();
list.add(item);
senderMap.put(sender, list);
}
properties.close();
}
subjects.close();
//System.out.println(list);
}
⼆.Java解析xml
1.DOM⽅式
DOM模式解析XML,是把整个XML⽂档当成⼀个对象来处理,会先把整个⽂档读⼊到内存⾥。是基于树的结构,通常需要加载整⽂档和构造DOM树,然后才能开始⼯作。
优缺点:解析简单,但不适合⼤⽂件
2.SAX⽅式
基于事件驱动的⽅式,适合⼤⽂件,⾮⼀次性将⽂件读⼊内存,主要是要写⾃⼰的handler。
* 读取xml⽂件,使⽤SAXParser解析
*
* @param uri
* @param NodeName
* @return
*/
public static List<Map<String, String>> ReadXML(String uri, String NodeName) {
try {
// 创建⼀个解析XML的⼯⼚对象
SAXParserFactory parserFactory = wInstance();
// 创建⼀个解析XML的对象
SAXParser parser = wSAXParser();
// 创建⼀个解析助⼿类
Myhandler myhandler = new Myhandler("Observation");
parser.parse(uri, myhandler);
generatedList();
} catch (Exception e) {
e.printStackTrace();
} finally {
}
return null;
}
/**
* 将list容器⾥的内容写⼊到新的xml⽂件
*
* @param vanet
*/
public static void createXML(List<Map<String, String>> vanet) {
try {
// 创建⼯⼚
SAXTransformerFactory factory = (SAXTransformerFactory) SAXTransformerFactory .newInstance();
TransformerHandler handler = wTransformerHandler();
Transformer info = Transformer();
// 是否⾃动添加额外的空⽩
info.setOutputProperty(OutputKeys.INDENT, "yes");
// 设置字符编码
info.setOutputProperty(OutputKeys.ENCODING, "utf-8");
info.setOutputProperty(OutputKeys.VERSION, "1.0");
info.setOutputProperty(OutputKeys.STANDALONE, "no");
// 保存创建的l
StreamResult result = new StreamResult(new FileOutputStream(
"f:\\xml\\map2.gpx"));
handler.setResult(result);
// 开始xml
handler.startDocument();
AttributesImpl impl = new AttributesImpl();
impl.clear();
addAttr(impl);
handler.startElement("", "", "gpx", impl);
for (int i = 0; i < vanet.size(); i++) {
/*
* <wpt lat="25.55" lon="99.1666666666667">
* <ele>123</ele>
* <name>矿1</name>
* <desc>test</desc>
* <sym>unistrong:104</sym>
* </wpt>
*/
Map<String, String> map = (i);
Map<String, String> map = (i);
Vehicle vh = setVehicle(map);
// ⽣成<wpt lat="xx" lon="xx">
impl.clear(); // 清空属性
impl.addAttribute("", "", "lat", "", vh.getLatitude());
impl.addAttribute("", "", "lon", "", vh.getLongitude());
handler.startElement("", "", "wpt", impl);
// ⽣成<name>xx</name>元素
impl.clear();
handler.startElement("", "", "name", impl);
String name = vh.getSender();
//System.out.println("name:"+name);
handler.CharArray(), 0, name.length()); // 为name元素添加⽂本 dElement("", "", "name");
impl.clear();
}
// ⽣成</class>
System.out.println("");
} catch (Exception e) {
e.printStackTrace();
}
}
public static void addAttr(AttributesImpl impl) {
impl.addAttribute("", "", "xmlns", "",
"pografix/GPX/1/1");
impl.addAttribute("", "", "creator", "", "MapSource 6.5");
impl.addAttribute("", "", "version", "", "1.1");
impl.addAttribute("", "", "xmlns:xsi", "",
"/2001/XMLSchema-instance");
impl.addAttribute("", "", "xsi:schemaLocation", "",
"pografix/GPX/1/1 pografix/GPX/1/1/gpx.xsd"); System.out.println("添加属性成功");
}
public class Myhandler extends DefaultHandler {
//
private HashSet<String> set = null;
// 存储正在解析的元素的数据
private Map<String, String> map = null;
// 存储所有解析的元素的数据
private List<Map<String, String>> list = null;
// 正在解析的元素的名字
String currentTag = null;
// 正在解析的元素的元素值
String currentValue = null;
/
/ 开始解析的元素
String nodeName = null;
public Myhandler(String nodeName) {
// TODO Auto-generated constructor stub
}
public HashSet<String> getSet() {
return set;
}
public List<Map<String, String>> getList() {
return list;
return list;
}
/*
* <Observation ID="18"> <Time>2013-04-18T08:00:00+00:00</Time>
* <Area>90268</Area> <Coordinates X="2521.4661" Y="6507.9541" />
* <Velocity>60</Velocity> <Direction>169</Direction>
* <ManualInfo>0</ManualInfo> <Sender>134569370</Sender> </Observation>
*/
// 开始解析⽂档,即开始解析XML根元素时调⽤该⽅法
@Override
public void startDocument() throws SAXException {
/
/ TODO Auto-generated method stub
System.out.println("--startDocument()--");
// 初始化Map
//list = new ArrayList<Map<String, String>>();
set = new HashSet<String>();
}
// 开始解析每个元素时都会调⽤该⽅法
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException {
// TODO Auto-generated method stub
/
/ 判断正在解析的元素是不是开始解析的元素
currentTag = null;
//System.out.println("--startElement()--" + qName);
if (qName.equals(nodeName)) {
//map = new HashMap<String, String>();
return;
}
/*if (qName.equals("Time") || qName.equals("Area")
|| qName.equals("Velocity") || qName.equals("Direction")||qName.equals("ManualInfo")) {
return;
}*/
if (qName.equals("Sender")) {
//System.out.println("sender");
// 判断正在解析的元素是否有属性值,如果有则将其全部取出并保存到map对象中,如:<person id="00001"></person> /*if (attributes != null && map != null) {
for (int i = 0; i < Length(); i++) {
//map.QName(i), Value(i));
//set.add(e)
}
}*/
currentTag = qName; // 正在解析的元素
}else {
return ;
}
}
// 解析到每个元素的内容时会调⽤此⽅法
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
// TODO Auto-generated method stub
//System.out.println("--characters()--");&& map != null
if (currentTag != null) {
currentValue = new String(ch, start, length);
// 如果内容不为空和空格,也不是换⾏符则将该元素名和值和存⼊map中
if (currentValue != null && !im().equals("")
&& !im().equals("\n")) {
//map.put(currentTag, currentValue);
set.add(currentValue);
System.out.println(currentTag + ": " + currentValue);
}
// 当前的元素已解析过,将其置空⽤于下⼀个元素的解析
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论