1. 程式人生 > >java + dom4j.jar 提取xml文件內容

java + dom4j.jar 提取xml文件內容

本例程主要藉助幾個遍歷的操作對xml格式下的內容進行提取,操作不是最優的方法,主要是練習使用幾個遍歷操作。

xml格式文件內容:

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE nitf SYSTEM "http://www.nitf.org/IPTC/NITF/3.3/specification/dtd/nitf-3-3.dtd">

-<nitf version="-//IPTC//DTD NITF 3.3//EN" change.time="19:30" change.date="June 10, 2005">


-<head>

<title>An End to Nuclear Testing</title>

<meta name="publication_day_of_month" content="7"/>

<meta name="publication_month" content="7"/>

<meta name="publication_year" content="1993"/>

<meta name="publication_day_of_week" content="Wednesday"/>

<meta name="dsk" content="Editorial Desk"/>

<meta name="print_page_number" content="14"/>

<meta name="print_section" content="A"/>

<meta name="print_column" content="1"/>

<meta name="online_sections" content="Opinion"/>


-<docdata>

<doc-id id-string="619929"/>

<doc.copyright year="1993" holder="The New York Times"/>


-<identified-content>

<classifier type="descriptor" class="indexing_service">ATOMIC WEAPONS</classifier>

<classifier type="descriptor" class="indexing_service">NUCLEAR TESTS</classifier>

<classifier type="descriptor" class="indexing_service">TESTS AND TESTING</classifier>

<classifier type="descriptor" class="indexing_service">EDITORIALS</classifier>

<person class="indexing_service">CLINTON, BILL (PRES)</person>

<classifier type="types_of_material" class="online_producer">Editorial</classifier>

<classifier type="taxonomic_classifier" class="online_producer">Top/Opinion</classifier>

<classifier type="taxonomic_classifier" class="online_producer">Top/Opinion/Opinion</classifier>

<classifier type="taxonomic_classifier" class="online_producer">Top/Opinion/Opinion/Editorials</classifier>

<classifier type="general_descriptor" class="online_producer">Nuclear Tests</classifier>

<classifier type="general_descriptor" class="online_producer">Atomic Weapons</classifier>

<classifier type="general_descriptor" class="online_producer">Tests and Testing</classifier>

<classifier type="general_descriptor" class="online_producer">Armament, Defense and Military Forces</classifier>

</identified-content>

</docdata>

<pubdata name="The New York Times" unit-of-measure="word" item-length="390" ex-ref="http://query.nytimes.com/gst/fullpage.html?res=9F0CEFDF1439F934A35754C0A965958260" date.publication="19930707T000000"/>

</head>


-<body>


-<body.head>


-<hedline>

<hl1>An End to Nuclear Testing</hl1>

</hedline>

</body.head>


-<body.content>


-<block class="lead_paragraph">

<p>For nearly half a century, test explosions in the Nevada desert were a reverberating reminder of cold war insecurity. Now the biggest worry is nuclear proliferation, not the Soviet threat. That's why President Clinton has quietly decided to extend the moratorium on tests of nuclear arms for at least 15 months.</p>

<p>To persuade nuclear have-nots to stay out of the bomb-making business, it makes more sense to halt testing and try to get others to do likewise than to conduct more demonstrations of America's deterrent power.</p>

</block>


-<block class="full_text">

<p>For nearly half a century, test explosions in the Nevada desert were a reverberating reminder of cold war insecurity. Now the biggest worry is nuclear proliferation, not the Soviet threat. That's why President Clinton has quietly decided to extend the moratorium on tests of nuclear arms for at least 15 months.</p>

<p>To persuade nuclear have-nots to stay out of the bomb-making business, it makes more sense to halt testing and try to get others to do likewise than to conduct more demonstrations of America's deterrent power.</p>

<p>Not that nuclear wannabes will necessarily follow America's lead. Nor will an end to all testing assure an end to bomb-making; states like Pakistan have developed nuclear devices without testing them first.</p>

<p>But calling a halt to U.S. nuclear testing makes it easier for leaders in Russia and France to extend the moratoriums they are now observing and improve the atmosphere for prompt negotiation of a treaty to ban all tests.</p>

<p>That test ban in turn should shore up international support for the 1968 Nonproliferation Treaty, linchpin of efforts to stop the spread of nuclear arms, when it comes up for review in 1995. It will also bolster the backing for tighter controls on exports used in bomb-making.</p>

<p>Mr. Clinton has taken three helpful steps. He has extended the Congressionally mandated moratorium on U.S. tests that was due to expire last week. He has declared that the U.S. will not test unless another nation does so first. And he wants to negotiate a total ban on testing.</p>

<p>But the President also wants the nuclear labs to be prepared for a prompt resumption of warhead safety and reliability tests. This could cost millions of dollars and doesn't make much sense, since in Mr. Clinton's own words, "After a thorough review, my Administration has determined that the nuclear weapons in the United States' arsenal are safe and reliable."</p>

<p>Moreover, preparations for testing can take on a life of their own: 30 years after the Limited Test Ban Treaty put an end to above-ground tests, the U.S. still spends $20 million a year on Safeguard C, a program to keep test sites ready.</p>

<p>American security no longer rests on that sort of eternal nuclear vigilance. Mr. Clinton's moratorium may make America safer than all the tests and preparations for tests that the nuclear labs can dream up.</p>

</block>

</body.content>

</body>

</nitf>

提取程式碼:

對多檔案進行操作,首先遍歷所有檔案路徑,存到遍歷器中,然後對遍歷器中的檔案路徑進行逐一操作。

package com.njupt.ymh;

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

import edu.princeton.cs.algs4.In;

/**
 * 返回檔名列表
 * @author 11860
 *
 */
public class SearchFile {

	public static List<String> getAllFile(String directoryPath,boolean isAddDirectory) {
        List<String> list = new ArrayList<String>(); // 存放檔案路徑
        File baseFile = new File(directoryPath);   // 當前路徑
        
        if (baseFile.isFile() || !baseFile.exists()) 
            return list;
        
        File[] files = baseFile.listFiles(); // 子檔案
        for (File file : files) {
            if (file.isDirectory()) 
            {  
                if(isAddDirectory)    // isAddDirectory 是否將子資料夾的路徑也新增到list集合中
                    list.add(file.getAbsolutePath());  // 全路徑
                
                list.addAll(getAllFile(file.getAbsolutePath(),isAddDirectory));
            } 
            else 
            {
                list.add(file.getAbsolutePath());
            }
        }
        return list;
    }
	public static void main(String[] args) {
		
		//SearchFile sFile = new SearchFile();
		List<String> listFile = SearchFile.getAllFile("E:\\huadai", false);
		System.out.println(listFile.size());
		File file = new File(listFile.get(3));
		In in = new In(listFile.get(4));
		while (in.hasNextLine()) {
			String readLine = in.readLine().trim();   // 讀取當前行
			System.out.println(readLine);
			
		}
		System.out.println(file.length());
		
	}

}
package com.njupt.ymh;

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

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

public class NewsPaper {
	int doc_id;  // 文章id
	String doc_title; // 文章標題
	String lead_paragraph ; // 文章首段
	String full_text; // 文章內容
	String date; // 文章日期
	public NewsPaper(String xml) {
		doc_id = -1;  // 文章id
		doc_title = null; // 文章標題
		lead_paragraph = null; // 文章首段
		full_text = null; // 文章內容
		date = null; // 文章日期
		searchValue(xml);
	}
	
	/**
	 * 載入Document檔案
	 * @param fileName
	 * @return Document
	 */
	private Document load(String fileName) {
		Document document = null; // 文件
		SAXReader saxReader = new SAXReader(); // 讀取檔案流
		
		try {
			document = saxReader.read(new File(fileName));
		} catch (DocumentException e) {
			e.printStackTrace();
		}
		
		return document;
	}
	
	/**
	 *  獲取Document的根節點
	 * @param args
	 */
	private Element getRootNode(Document document) {
		return document.getRootElement();
	}
	
	/**
	 *  獲取所需節點值
	 * @param xml
	 */
	private void searchValue(String xml) {
		Document document = load(xml);
        Element root = getRootNode(document); // 根節點  
      
        // 文章日期
        date = xml.substring(10, 20);
        // 文章標題
        doc_title = root.valueOf("//head/title");
        
        // 文章-id
        List<Node> list_doc_id = document.selectNodes("//doc-id/@id-string"); 
        for(Node ele:list_doc_id){
        	doc_id = Integer.parseInt(ele.getText());
        }
        
        // 文章內容
        for (Iterator<Element> i = root.elementIterator(); i.hasNext();) {  
            Element el = (Element) i.next();   // head、body
         
            // 對body節點進行操作
            if (el.getName() == "body") { // body
            	for (Iterator<Element> body = el.elementIterator(); body.hasNext();) {
					Element elbody = body.next();
					
					if (elbody.getName() == "body.content") { //body.content
						for (Iterator<Element> block = elbody.elementIterator(); block.hasNext();) {
							Element block_class = (Element) block.next();
							
							if (block_class.attributeValue("class").equals("full_text") ) { // full_text
								List<Node> list_text = block_class.selectNodes("p");
								for (Node text : list_text) 
									if (full_text == null) 
										full_text = text.getStringValue();
									else 
										full_text = full_text +" " + text.getStringValue();
							}
							
							else {   // lead_paragraph
								List<Node> list_lead = block_class.selectNodes("p");
								for (Node lead : list_lead) 
									if (lead_paragraph == null)
										lead_paragraph = lead.getStringValue();
									else 
										lead_paragraph = lead_paragraph +" "+ lead.getStringValue();
							}
						}
					}
				}
            }
        }  
	}
	
	/**
	 *  獲取文章標題
	 * @param args
	 */
	public String getTitle() {
		return doc_title;
	}
	
	/**
	 *  獲取文章id
	 * @param args
	 */
	public int getID() {
		return doc_id;
	}
	
	/**
	 *  獲取文章簡介
	 * @param args
	 */
	public String getLead() {
		if (getID() < 394070  && lead_paragraph != null && lead_paragraph.length() > 6)      //1990-10-22之前
			return lead_paragraph.substring(6);
		else                         //1990-10-22之後
			return lead_paragraph;
	}
	
	/**
	 *  獲取文章正文
	 * @param args
	 */
	public String getfull() {
		if (getID() < 394070 && full_text != null && full_text.length() > 6)           //1990-10-22之前
			return full_text.substring(6);
		else
			return full_text;
	}
	
	/**
	 *   獲取文章日期
	 * @param args
	 */
	public String getDate() {
		return date;
	}
	
	/**
	 * 判斷獲取的資訊是否有用
	 * @return
	 */
	public boolean isUseful() {
		if (getID() == -1)
			return false;
		if (getDate() == null ) 
			return false;
		if (getTitle() == null || getTitle().length() >= 255) 
			return false;
		if (getLead() == null || getLead().length() >= 65535 ) 
			return false;
		if (getfull() == null || getfull().length() >= 65535) 
			return false;
		
		return   !isnum();
	}
	
	/**
	 * 挑出具有特殊開頭的數字內容文章
	 * @return
	 */
	private boolean isnum() {
		if (getfull() != null && getfull().length() > 24) {
			if (getfull().substring(0, 20).contains("*3*** COMPANY REPORT") ) {  // 剔除數字文章  
				return true;
			}
		}
		return false;
	}
	
	
	public static void main(String[] args) {
		List<String> listFile = SearchFile.getAllFile("E:\\huadai\\1989\\10", false); // 檔案列表
		//String date;  // 日期
		int count = 0;
		int i = 0;
		for (String string : listFile) {
			NewsPaper newsPaper = new NewsPaper(string);
			count++;
			if (!newsPaper.isUseful()) {
				i++;
				System.out.println(newsPaper.getLead());
			}	
		}
		
		System.out.println(i + "    "+ count);
		
	}
}