1. java怎麼取出xml中指定節點中的內容
可以通過元素中的getText方法獲取到節點的內容。
舉例:
SAXReader sax = new SAXReader();
Document document = sax.read(reader);//reader為定義的一個字元串,可以轉換為xml
Element root = document.getRootElement();//獲取到根節點元素String str = root .getText()//獲取到節點的內容
用到的是dom4j-1.6.1.jar,需要引入的包是:
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
備註:如果是多個子節點可以通過」Element xx=root .element("code")「獲取到子節點的元素,前提是需要知道子節點的名稱。
2. java如何從一個xml文件讀取根節點、子節點屬性。
思路如下:
xml文件未知不明白什麼意思?我索性就理解為一個目錄下有很多xml文件,每個xml文件獲取其中的bean節點屬性。
1> 有xml文件路徑,獲取該路徑下的所有文件,用後綴「.xml」或「.XML」過濾得到xml文件。
2> javax.xml.parsers.DocumentBuilder builder = factory.newDocumentBuilder();
org.w3c.dom.Document doc = builder.parse(is); 創建文檔對象。
3>doc.getChildNodes()獲取文檔中所有的節點,循環遍歷所得節點node,
通過node.getAttributes()獲取節點所有屬性,獲取各個屬性name和值即可,輸出想要得到的數據。
或者通過doc.getElementsByTagName("bean");直接指定bean節點。然後用同樣的方法獲取屬性名和值,輸出。
以上是根據jdk的W3C庫解析的。想方便可以通過dom4j、jdom進行文件操作。思路變化不大。
3. java中如何讀取xml中數據。多節點的。給我一個例子,謝謝。
在我們的程序中,通常要有一些根據主機環境確定的變數.比如資料庫訪問用戶名和密碼,不同的主機可能設置不一樣.只要更改XML配置文件,就可以正常運行.
localhost
sqlname
username
password
上面這個myenv.xml配置文件一般是放在tomcat的WEB-INF/classes目錄下.
我們編制一個Java程序直接讀取,將dbhost dbuser dbpassword提取出來供其他程序訪問資料庫用.
目前使用SAX比較的多,與DOM主要區別是 SAX是一行一行讀取XML文件進行分析,適合比較大文件,DOM是一次性讀入內存,顯然不能對付大文件.這里我們使用SAX解析,由於SAX解析器不斷在發展,網上有不少文章是針對老版本的.假如你使用JDK1.4 ,可以參考 使用SAX處理XML文檔 一文.這里的程序是根據其改進並且經過實踐調試得來的.
對上面myenv.xml讀取的Java程序:
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.SAXException;
import java.util.Properties;
//使用DefaultHandler的好處 是 不必陳列出所有方法,
public class ConfigParser extends DefaultHandler {
////定義一個Properties 用來存放 dbhost dbuser dbpassword的值
private Properties props;
private String currentSet;
private String currentName;
private StringBuffer currentValue = new StringBuffer();
//構建器初始化props
public ConfigParser() {
this.props = new Properties();
}
public Properties getProps() {
return this.props;
}
//定義開始解析元素的方法. 這里是將中的名稱xxx提取出來.
public void startElement(String uri, String localName, String qName, Attributes attributes)
throws SAXException {
currentValue.delete(0, currentValue.length());
this.currentName =qName;
}
//這里是將之間的值加入到currentValue
public void characters(char[] ch, int start, int length) throws SAXException {
currentValue.append(ch, start, length);
}
//在碰到結束後,將之前的名稱和值一一對應保存在props中
public void endElement(String uri, String localName, String qName) throws SAXException {
props.put(qName.toLowerCase(), currentValue.toString().trim());
}
}
上面的這個解析程序比較簡單吧? 其實解析XML就是這么簡單.
現在我們已經將dbhost dbuser dbpassword的值localhost sqlname username password提取了出來.但是這只是在在解析器內部,我們的程序還不能訪問.需要再編制一個程序.
import java.util.Properties;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import java.net.URL;
public class ParseXML{
//定義一個Properties 用來存放 dbhost dbuser dbpassword的值
private Properties props;
//這里的props
public Properties getProps() {
return this.props;
}
public void parse(String filename) throws Exception {
//將我們的解析器對象化
ConfigParser handler = new ConfigParser();
//獲取SAX工廠對象
SAXParserFactory factory = SAXParserFactory.newInstance();
factory.setNamespaceAware(false);
factory.setValidating(false);
//獲取SAX解析
SAXParser parser = factory.newSAXParser();
//得到配置文件myenv.xml所在目錄. tomcat中是在WEB-INF/classes
//下例中BeansConstants是用來存放xml文件中配置信息的類,可以自己代替或定義
URL confURL = BeansConstants.class.getClassLoader().getResource(filename);
try
{
//將解析器和解析對象myenv.xml聯系起來,開始解析
parser.parse(confURL.toString(), handler);
//獲取解析成功後的屬性 以後 我們其他應用程序只要調用本程序的props就可以提取出屬性名稱和值了
props = handler.getProps();
}finally{
factory=null;
parser=null;
handler=null;
}
}
}
由於我們的XML文件是使用最簡單的形式 ,因此解析器相對簡單,但是這已經足夠對付我們的配置文件了.
4. java如何獲取XML中子節點的內容
java中獲取xml節點元素值 根據不同的處理xml方式不同而不同。
java中解析xml的方式:大體可以使用以下四種
------------------------------------------------------------
DOM(Document Object Model)
為 XML 文檔的已解析版本定義了一組介面。解析器讀入整個文檔,
然後構建一個駐留內存的樹結構,然後代碼就可以使用 DOM 介面來操作這個樹結構。
優點:整個文檔樹在內存中,便於操作;支持刪除、修改、重新排列等多種功能;
缺點:將整個文檔調入內存(包括無用的節點),浪費時間和空間;
使用場合:一旦解析了文檔還需多次訪問這些數據;硬體資源充足(內存、CPU)
SAX(Simple API for XML)
為解決DOM的問題,出現了SAX。SAX ,事件驅動。
當解析器發現元素開始、元素結束、文本、文檔的開始或結束等時,發送事件,
程序員編寫響應這些事件的代碼,保存數據。優點:不用事先調入整個文檔,佔用資源少;
SAX解析器代碼比DOM解析器代碼小,適於Applet,下載。
缺點:不是持久的;事件過後,若沒保存數據,那麼數據就丟了;無狀態性;
從事件中只能得到文本,但不知該文本屬於哪個元素;
使用場合:Applet;只需XML文檔的少量內容,很少回頭訪問;機器內存少;
DOM4J
DOM4J 是一個非常非常優秀的Java XML API,具有性能優異、功能強大和極端易用使用的特點,
同時它也是一個開放源代碼的軟體。如今你可以看到越來越多的 Java 軟體都在使用 DOM4J 來讀寫 XML,
特別值得一提的是連 Sun 的 JAXM 也在用 DOM4J
JDOM
為減少DOM、SAX的編碼量,出現了JDOM;優點:20-80原則,極大減少了代碼量。
使用場合:要實現的功能簡單,如解析、創建等,但在底層,JDOM還是使用SAX(最常用)、DOM、Xanan文檔。
------------------------------
參考代碼
dom4j
------------------------------
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
---------------------------------------------
File f = new File("students.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
for (Iterator iter = root.elementIterator(); iter.hasNext();) {
Element element = (Element) iter.next();
// System.out.println(element.attributeValue("email"));
String ids=element.elementText("stuId");
System.out.println(ids);
String names=element.elementText("stuName");
System.out.println(names);
String ages=element.elementText("age");
System.out.println(ages);
}
------------------------------------
dom 方式
---------------
import javax.xml.parsers.*;
import javax.xml.transform.*;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
------------------------
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
// 允許名字空間
// factory.setNamespaceAware(true);
// 允許驗證
// factory.setValidating(true);
// 獲得DocumentBuilder的一個實例
DocumentBuilder builder = null;
try {
builder = factory.newDocumentBuilder();
} catch (ParserConfigurationException pce) {
System.err.println(pce);
// 出異常時輸出異常信息,然後退出,下同
System.exit(1);
}
Document doc = null;
// 解析文檔,並獲得一個Document實例。
try {
try {
// InputStream is=new FileInputStream("students.xml");
doc = builder.parse("students.xml");
// doc = builder.parse(is);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (DOMException dom) {
System.err.println(dom.getMessage());
System.exit(1);
} catch (IOException ioe) {
System.err.println(ioe);
// System.exit(1);
}
for (int i = 0; i < nlStudent.getLength(); i++) {
Element elmtStudent = (Element) nlStudent.item(i);
String email = elmtStudent.getAttribute("email");
System.out.println(email);
NodeList ids = elmtStudent.getElementsByTagName("stuId");
Element id = (Element)ids.item(0);
Node tId = id.getFirstChild();
System.out.println(tId.getNodeValue());
NodeList names = elmtStudent.getElementsByTagName("stuName");
Element e = (Element)names.item(0);
Node tName = e.getFirstChild();
System.out.println(tName.getNodeValue());
}
5. java中如何直接獲得xml中的某個指定的節點
�0�2�0�2�0�2 最近遇到一個問題,用java解析xml時,需要獲得一個xml文檔中指定的某個節點,當然最簡單的辦法就是遍歷所有的節點,如某個節點滿足條件,則是我們要的結果,但我不想遍歷所有的節點,因為這個問題只是一個復雜過程中的一小步,它會被反復調用,因此我需要最直接的方法獲得某個已知屬性值的確定節點。因此,這個問題也可以概括為:有沒有根據節點(或name)屬性名獲得該節點的原api。
�0�2�0�2�0�2�0�2 具體一些,有如下xml文檔:<sheet<field row="2" col="2" type="int"DEA_XZ</field2_2
<field row="2" col="3" type="string"RTP_ID</field2_3
<field row="2" col="4" type="string"DEA_YEAR</field2_4
<field row="2" col="7" type="int"DEA_RTP_TYPE</field2_7</sheet�0�2�0�2 我想獲得row="2" col="3"的節點,據我所查,好像沒有直接的方法。
�0�2�0�2 變通一下,xml修改如下:�0�2<sheet<field name="row2_col2" type="int"DEA_XZ</field2_2
<field name="row2_col3" type="string"RTP_ID</field2_3
<field name="row2_col4" type="string"DEA_YEAR</field2_4
<field name="row2_col7" type="int"DEA_RTP_TYPE</field2_7</sheet�0�2�0�2 這樣呢?有沒有直接的api,可以獲得name為row2_col3的節點?同樣,我也沒有得到答案,大家有知道告訴小弟一下,不勝感激。
�0�2�0�2 實在沒有辦法,我就用了種「另類」的方式,xml如下:<sheet<field2_2 type="int"DEA_XZ</field2_2
<field2_3 type="string"RTP_ID</field2_3
<field2_4 type="string"DEA_YEAR</field2_4
<field2_7 type="int"DEA_RTP_TYPE</field2_7</sheet�0�2�0�2 這樣看起來很不優雅,至少我是這么認為的。但這樣卻可以直接拿到你想要的節點:�0�2org.jdom.Element root = document.getRootElement();
�0�2�0�2 目前,我就是這樣解決的,但我感覺很不優雅,我想我的xml文檔(配置)文件應該保持第一種或第二種格式更好些。所以請大家幫忙,看看有沒有直接的方法(api).
6. java語句如何獲取XML文件的節點值
package org.lxh.xml.dom ;
import java.io.* ;
import org.w3c.dom.* ;
import javax.xml.parsers.* ;
public class DOMDemo {
public static void main(String args[]) throws Exception {
// 取得DocumentBuilderFactory類的對象
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance() ;
// 取得DocumentBuilder類的對象
DocumentBuilder build = factory.newDocumentBuilder() ;
Document doc = build.parse(new File("D:" + File.separator + "dom_demo_02.xml")) ;
NodeList nl = doc.getElementsByTagName("name") ;
// 輸出節點
System.out.println("姓名:" + nl.item(0).getFirstChild().getNodeValue()) ;
}
}
7. 在Java中如何讀取XML字元串的元素值
java讀取xml節點元素,主要使用java提供的解析xml的工具類SAXParserFactory,如下代碼:
package xml.xmlreader;import java.io.File;import java.net.URL;import java.util.Properties;import javax.xml.parsers.SAXParser;import javax.xml.parsers.SAXParserFactory;public class CFGParser {//解析xml文件的工具類 private Properties props; public Properties getProps() { return props; } public void setProps(Properties props) { this.props = props; } public void parse(String filename) throws Exception { CFGHandler handler = new CFGHandler(); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(false); factory.setValidating(false); SAXParser parser = factory.newSAXParser(); URL confURL = super.getClass().getClassLoader().getResource(filename); if (confURL == null) { System.out.println("Can't find configration file."); return; } try { parser.parse(confURL.toString(), handler); this.props = handler.getProps(); } finally { factory = null; parser = null; handler = null; } } public void parseFile(String filename) throws Exception { CFGHandler handler = new CFGHandler(); SAXParserFactory factory = SAXParserFactory.newInstance(); factory.setNamespaceAware(false); factory.setValidating(false); SAXParser parser = factory.newSAXParser(); File f = new File(filename); if ((f == null) || (!f.exists())) return; try { parser.parse(f, handler); this.props = handler.getProps(); } finally { factory = null; parser = null; handler = null; } }}package xml.xmlreader;import java.util.Properties;import org.xml.sax.Attributes;import org.xml.sax.SAXException;import org.xml.sax.helpers.DefaultHandler; public class CFGHandler extends DefaultHandler{ private Properties props; private String currentSet; private String currentName; private StringBuffer currentValue = new StringBuffer(); public CFGHandler() { this.props = new Properties(); } public Properties getProps() { return this.props; } public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { this.currentValue.delete(0, this.currentValue.length()); this.currentName = qName; } public void characters(char[] ch, int start, int length) throws SAXException { this.currentValue.append(ch, start, length); } public void endElement(String uri, String localName, String qName) throws SAXException { this.props.put(qName.toLowerCase(), this.currentValue.toString().trim()); }}xml文件 <?xml version="1.0" encoding="UTF-8"?><xml-body> <refresh_userlist desc="用戶列表刷新間隔時間(秒)">6</refresh_userlist> <refresh_message desc="短消息刷新間隔時間(秒)">10</refresh_message> <morningbegin desc="上午上班時間">23:00</morningbegin> <morningend desc="上午下班時間">12:00</morningend> <afternoonbegin desc="下午上班時間">18:00</afternoonbegin></xml-body>jsp獲取各個節點的值:<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><html> <jsp:useBean id="cfgp" scope="page" class="xml.xmlreader.CFGParser"></jsp:useBean> <body> <% cfgp.parse("kaoqin.xml"); Properties pro = cfgp.getProps(); String stTime = pro.getProperty("morningbegin"); String edTime = pro.getProperty("morningend"); String afternoonbegin = pro.getProperty("afternoonbegin"); out.println(stTime+"\n"+edTime+"\n"+afternoonbegin); System.out.println(stTime+"\n"+edTime+"\n"+afternoonbegin); %> </body></html>
8. JAVA怎麼從XML里取出節點的值
可以用dom4j. 參考如下代碼(記得引入dom4j-1.6.1.jar和jaxen-1.1.4.jar):
<?xmlversion="1.0"encoding="ISO-8859-1"?>
<CATALOG>
<allSong>
<Name>girl</Name>
<Time>2012.12.21</Time>
</allSong>
<CD>
<TITLE>EmpireBurlesque</TITLE>
<ARTIST>BobadDylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Coludafadmbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
<CD>
<TITLE>EmpireBurlesque</TITLE>
<ARTIST>BobDylan</ARTIST>
<COUNTRY>USA</COUNTRY>
<COMPANY>Columbia</COMPANY>
<PRICE>10.90</PRICE>
<YEAR>1985</YEAR>
</CD>
</CATALOG>
importjava.io.File;
importjava.util.List;
importorg.dom4j.Document;
importorg.dom4j.Element;
importorg.dom4j.io.SAXReader;
publicclassTest{
/**
*@paramargs
*@throwsException
*/
@SuppressWarnings({"rawtypes","unchecked"})
publicstaticvoidmain(String[]args)throwsException{
SAXReadersaxReader=newSAXReader();
FileinputFile=newFile("src/this.xml");
Documentdocument=saxReader.read(inputFile);
Elementroot=document.getRootElement();
Elemente=(Element)root.selectSingleNode("/CATALOG/allSong/Name");
//allSong節點下的Name節點的value
Stringname=e.getText();
System.out.println(name);
ListcdList=root.selectNodes("/CATALOG/CD/ARTIST");
Element[]cdArray=newElement[cdList.size()];
cdList.toArray(cdArray);
//第二個CD節點下的ARTIST節點的value
StringARTIST2=cdArray[1].getText();
System.out.println(ARTIST2);
}
}
9. java讀取帶節點的xml數據
SAXBuilder b = new SAXBuilder();
Document read_doc = b.build(new File("datafiles/address.xml"));//換成你自己的文件路徑
Element root = read_doc.getRootElement();
List status = root.getChildren("status");
for( int i = 0;i<ls.size();i++){
Element e = (Element)status.get(i);
String id= e.getChildText("id");
String created_at = e.getChildText("create_at");
String text = e.getChildText("text");
String user_name=e.getChild("user").getChildText("name");
String user_location=e.getChild("user").getChildText("location");
}
需要jdom包
10. java讀取xml文件內容
XMLStreamReaderreader=inputFactory.createXMLStreamReader(newFileInputStream(newFile("xmlPath")));//這里可以替換成一個流
List<Map<String,String>>dataList=newArrayList<Map<String,String>>();
while(reader.hasNext()){
intevent=reader.next();
if(event==XMLStreamConstants.START_ELEMENT){
//這里獲取你的節點名稱
if(reader.getName().equals("Hardware")){
intattrCount=reader.getAttributeCount();
Map<String,String>dataMap=newHashMap<String,String>();
for(inti=0;i<attrCount;i++){
StringattrName=reader.getAttributeLocalName(i);
StringattrValue=reader.getAttributeValue(i);
// System.out.println("----attrname:"+attrName);
// System.out.println("----attrvalue:"+attrValue);
dataMap.put(attrName,attrValue);
}
dataList.add(dataMap);
}
}
}