javaxml屬性
① 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進行文件操作。思路變化不大。
② 如何用java獲得xml文件中標簽的屬性列表值
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;public class MyXMLReader2JDOM {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("xmlcount.xml"));
Element foo = doc.getRootElement();
// List allChildren = foo.getChildren();
System.out.print( foo.getAttributeValue("month-count"));
System.out.println(foo.getAttributeValue("total-count"));
} catch (Exception e) {
e.printStackTrace();
}
}
}
③ java怎麼通過xml節點的屬性獲取這個節點的值
創建解析器
SAXReader saxreader = new SAXReader();讀取文檔
Document doc = saxreader.read(new File("url"));獲取根
Element root = doc.getRootElement();獲取子節點
List<Element> list = root.elements();System.out.println(e.elementText("name"));
System.out.println(e.element("score").attributeValue("java"));
④ Java怎麼解析xml子節點中的屬性,如下
dom4j中,使用Element.attributes方法可以獲取到節點的屬性,而使用elements則可以獲取相應的子節點
比如:
Element root = doc.getRootElement();
List attrList = root.attributes();
for (int i = 0; i < attrList.size(); i++) {
//屬性的取得
Attribute item = (Attribute)attrList.get(i);
System.out.println(item.getName() + "=" + item.getValue());
}
List childList = root.elements();
for (int i = 0; i < childList.size(); i++) {
//子節點的操作
Element it = (Element) childList.get(i);
//對子節點進行其它操作...
}
⑤ java XML解析詳解
(I)Java通過DOM解析XML
1>得到DOM解析器的工廠實例
DocumentBuilderFactory domfac=DocumentBuilderFactory.newInstance();
得到javax.xml.parsers.DocumentBuilderFactory;類的實例就是我們要的解析器工廠
2>從DOM工廠獲得DOM解析器
DocumentBuilder dombuilder=domfac.newDocumentBuilder();
通過javax.xml.parsers.DocumentBuilderFactory實例的靜態方法newDocumentBuilder()得到DOM解析器
3>把要解析的XML文檔轉化為輸入流,以便DOM解析器解析它
InputStream is=new FileInputStream("bin/library.xml");
InputStream是一個介面。
4>解析XML文檔的輸入流,得到一個Document
Document doc=dombuilder.parse(is);
由XML文檔的輸入流得到一個org.w3c.dom.Document對象,以後的處理都是對Document對象進行的
5>得到XML文檔的根節點
Element root=doc.getDocumentElement();
在DOM中只有根節點是一個org.w3c.dom.Element對象。
6>得到節點的子節點
NodeList books=root.getChildNodes();
for(int i=0;i<books.getLength();i++){
Node book=books.item(i);
}
這是用一個org.w3c.dom.NodeList介面來存放它所有子節點的,還有一種輪循子節點的方法,後面有介紹
7>取得節點的屬性值
String email=book.getAttributes().getNamedItem("email").getNodeValue();
System.out.println(email);
注意,節點的屬性也是它的子節點。它的節點類型也是Node.ELEMENT_NODE
8>輪循子節點
for(Node node=book.getFirstChild();node!=null;node=node.getNextSibling()){
if(node.getNodeType()==Node.ELEMENT_NODE){
if(node.getNodeName().equals("name")){
String name=node.getNodeValue();
String name1=node.getFirstChild().getNodeValue();
...
if(node.getNodeName().equals("price")){
String price=node.getFirstChild().getNodeValue();
...
Java通過SAX解析XML
Simple API for XML(簡稱SAX)是個循序存取XML的解析器API。
一個實現SAX的解析器(也就是「SAX Parser」)以一個串流解析器的型式作用,擁有事件驅動API。由使用者定義回調函數,解析時,若發生事件的話會被調用。SAX事件包括:
XML 文字 節點
XML 元素 節點
XML 處理指令
XML 注釋
Java代碼
<person>
<user>
<username>謝成志</username>
<password>6626310xie</password>
<sex>男</sex>
<birthday>1988/11/28</birthday>
<headpic>
<pictitle>ermao</pictitle>
<picurl>images/head1.jpg</picurl>
</headpic>
</user>
</person>
此為下面即將解析度簡單xml結構,並將其封裝成一個User對象。
////////////////////////////////////////////////////////////////////////////////////
Java代碼
<span style="font-family: courier new,courier; font-size: small;">package com.xcz.xml;
import java.io.File;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
import com.xcz.util.SaxUtil;
public class Sax4XML {
public static void main(String[] args) {
try {
//1.獲取factory
SAXParserFactory factory = SAXParserFactory.newInstance();
//2.獲取parser
SAXParser parser = factory.newSAXParser();
//3.獲取解析時的監聽器對象
SaxUtil su = new SaxUtil();
//4.開始解析
parser.parse(new File("src/user-params.xml"), su);
System.out.println(su.getUser());
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
</span>
////////////////////////////////////////////////////////////////////////////////////
Java代碼
<span style="font-family: courier new,courier; font-size: small;">package com.xcz.util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import com.xcz.po.HeadPic;
import com.xcz.po.User;
/**
* 定義xml解析時的監聽類
*
* 實現方式有很多,可以實現介面:ContentHandler,DTDHandler, EntityResolver 和 ErrorHandler
* 但我們常用的繼承:DefaultHandler
*/
public class SaxUtil extends DefaultHandler {
private User user;
private HeadPic headPic;
private String content;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
@Override
public void characters(char[] ch, int start, int length)
throws SAXException {
content = new String(ch, start, length);
}
//當解析到文本開始時觸發
@Override
public void startDocument() throws SAXException {
super.startDocument();
}
//當解析到文本結束時觸發
@Override
public void endDocument() throws SAXException {
super.endDocument();
}
//當解析到元素開始時觸發
@Override
public void startElement(String uri, String localName, String name,
Attributes attributes) throws SAXException
{
if("user".equals(name))
{
user = new User();
}
if("headpic".equals(name))
{
headPic = new HeadPic();
}
}
//當解析到元素結束時觸發
@Override
public void endElement(String uri, String localName, String name)
throws SAXException
{
if("username".equals(name))
{
user.setUsername(content);
}
if("password".equals(name))
{
user.setPassword(content);
}
if("sex".equals(name))
{
user.setSex(content);
}
if("birthday".equals(name))
{
try {
user.setBirthday(sdf.parse(content));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if("pictitle".equals(name))
{
headPic.setPicTitle(content);
}
if("picurl".equals(name))
{
headPic.setPicUrl(content);
user.setHeadPic(headPic);
}
}
public User getUser(){
return user;
}
}</span>
[優點]
(1).節約內存開銷
SAX解析器在某些方面優於DOM風格解析器,因為SAX解析器的內存使用量一般遠低於DOM解析器使用量。DOM解析器在任何處理開始之前,必須將xml以整棵樹放在內存,所以DOM解析器的內存使用量完全根據輸入資料的大小。相對來說,SAX解析器的內存內容,是只基於XML檔案的最大深度(XML樹的最大深度)和單一XML項目上XML屬性儲存的最大資料。
(2)解析速度快
因為SAX事件驅動的本質,處理文件通常會比DOM風格的解析器快。
[缺點]
SAX事件驅動的模型對於XML解析很有用,但它確實有某些缺點。
某些種類的XML驗證需要存取整份文件。例如,一個DTD IDREF屬性需要文件內有項目使用指定字串當成DTD ID屬性。要在SAX解析器內驗證,必須追蹤每個之前遇過的ID和IDREF屬性,檢查是否有任何相符。更甚者,一個IDREF找不到對應的ID,使用者只會在整份文件都解析完後才發現,若這種連結對於建立有效輸出是重要的,那用在處理整份文件的時間只是浪費。