⑴ java的xml的解析方式有什麼,他們的解析流程是怎麼樣的,有什麼區別
DOM4J,JDOM,SAX
public class DomTest3
{
public static void main(String[] args) throws Exception
{
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
Document doc = db.parse(new File("student.xml"));
//獲得根元素結點
Element root = doc.getDocumentElement();
parseElement(root);
}
private static void parseElement(Element element)
{
String tagName = element.getNodeName();
NodeList children = element.getChildNodes();
System.out.print("<" + tagName);
//element元素的所有屬性所構成的NamedNodeMap對象,需要對其進行判斷
NamedNodeMap map = element.getAttributes();
//如果該元素存在屬性
if(null != map)
{
for(int i = 0; i < map.getLength(); i++)
{
//獲得該元素的每一個屬性
Attr attr = (Attr)map.item(i);
String attrName = attr.getName();
String attrValue = attr.getValue();
System.out.print(" " + attrName + "=\"" + attrValue + "\"");
}
}
System.out.print(">");
for(int i = 0; i < children.getLength(); i++)
{
Node node = children.item(i);
//獲得結點的類型
short nodeType = node.getNodeType();
if(nodeType == Node.ELEMENT_NODE)
{
//是元素,繼續遞歸
parseElement((Element)node);
}
else if(nodeType == Node.TEXT_NODE)
{
//遞歸出口
System.out.print(node.getNodeValue());
}
else if(nodeType == Node.COMMENT_NODE)
{
System.out.print("<!--");
Comment comment = (Comment)node;
//注釋內容
String data = comment.getData();
System.out.print(data);
System.out.print("-->");
}
}
System.out.print("</" + tagName + ">");
}
}
public class SaxTest1
{
public static void main(String[] args) throws Exception
{
//step1: 獲得SAX解析器工廠實例
SAXParserFactory factory = SAXParserFactory.newInstance();
//step2: 獲得SAX解析器實例
SAXParser parser = factory.newSAXParser();
//step3: 開始進行解析
parser.parse(new File("student.xml"), new MyHandler());
}
}
class MyHandler extends DefaultHandler
{
@Override
public void startDocument() throws SAXException
{
System.out.println("parse began");
}
@Override
public void endDocument() throws SAXException
{
System.out.println("parse finished");
}
@Override
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
System.out.println("start element");
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException
{
System.out.println("finish element");
}
}
public class JDomTest1
{
public static void main(String[] args) throws Exception
{
Document document = new Document();
Element root = new Element("root");
document.addContent(root);
Comment comment = new Comment("This is my comments");
root.addContent(comment);
Element e = new Element("hello");
e.setAttribute("sohu", "www.sohu.com");
root.addContent(e);
Element e2 = new Element("world");
Attribute attr = new Attribute("test", "hehe");
e2.setAttribute(attr);
e.addContent(e2);
e2.addContent(new Element("aaa").setAttribute("a", "b")
.setAttribute("x", "y").setAttribute("gg", "hh").setText("text content"));
Format format = Format.getPrettyFormat();
format.setIndent(" ");
// format.setEncoding("gbk");
XMLOutputter out = new XMLOutputter(format);
out.output(document, new FileWriter("jdom.xml"));
}
}
⑵ 在java在如何解析XML文件
在Java環境中處理XML文件主要有四種方法:DOM(Document Object Model)、SAX(Simple API for XML)、JDOM以及JAXB(Java Architecture for XML Binding)。DOM是一種由W3C提供的方法,它將整個XML文件載入到內存中,並構建一棵數據樹,以便快速訪問各個節點。這種方法對系統性能要求較高,適合較小的XML文件,但對於較大的文檔來說,可能不是最佳選擇。
DOM API直接遵循XML規范,每個節點都是基於Node介面的,從多態性的角度來看,這是一種優秀的實現。然而,在Java中使用時,這種設計並不十分方便,且可讀性較差。
以DOM為例,我們可以通過以下代碼導入必要的包:
<pre>
<code>
import javax.xml.parsers.*;
import org.w3c.dom.*;
import org.apache.crimson.tree.XmlDocument;
</code>
</pre>
接下來,我們創建一個DocumentBuilderFactory實例,並設置其屬性:
<pre>
<code>
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setNamespaceAware(true);
factory.setValidating(true);
</code>
</pre>
然後,我們通過DocumentBuilderFactory獲得一個DocumentBuilder實例,並解析XML文件:
<pre>
<code>
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(fileURI);
</code>
</pre>
接下來,我們獲取根節點並遍歷所有student節點:
<pre>
<code>
Element elmtStuInfo = doc.getDocumentElement();
NodeList nlStudent = elmtStuInfo.getElementsByTagNameNS(strNamespace, "student");
for (int i = 0; i < nlStudent.getLength(); i++) {
Element elmtStudent = (Element)nlStudent.item(i);
NodeList nlCurrent = elmtStudent.getElementsByTagNameNS(strNamespace, "name");
}
</code>
</pre>
總之,DOM方法雖然功能強大,但對大文件處理效率較低,且在Java中的應用不夠直觀。在實際開發中,可根據具體需求選擇合適的解析方式。
⑶ Java解析XML的幾種方法
DOM解析
①構建Document對象:
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = bdf.newDocumentBuilder();
InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(xml文件);
Document doc = bd.parse(is);
②遍歷DOM對象
Document: XML文檔對象,由解析器獲取
NodeList: 節點數組
Node: 節點(包括element、#text)
Element: 元素,可用於獲取屬性參數
SAX(Simple API for XML)解析
【DefaultHandler類】
SAX事件處理程序的默認基類,實現了DTDHandler、ErrorHandler、ContextHandler和EntityResolver介面,通常
做法是,繼承該基類,重寫需要的方法,如startDocument()
【創建SAX解析器】
SAXParserFactory saxf = SAXParserFactory.newInstance();
SAXParser sax = saxf.newSAXParser();
註:關於遍歷
①深度優先遍歷(Depthi-First Traserval)
②廣度優先遍歷(Width-First Traserval)
JDOM(Java-based Document Object Model)
DOM4J(Document Object Model for Java)
StAX(Streaming API for XML)
⑷ java解析xml文件
SaxReader reader = new SaxReader();
Document doc = reader.read(new File("class.xml"));
Element element = doc.getRootElement();//獲取根元素
迭代器:取根元素下的子元素名稱
Iterator<Element> iter = element.elementIterator();
while(iter.hashNext){
Element el = (Element)iter.next();
el.getName();//獲取元素名稱
el.getText();//獲取元素值
}
//獲取屬性名稱、值
Iterator<Attribute> iter1 = element.attributeIterator();
while(iter1.hashNext()){
Attribute el = (Attribute)iter1.next();
el.getName();el.getValue();//獲取屬性名稱和值
}
如果取所有,則用遞歸取:
public void getInfo(Element root){
Iterator<Element> iter = root.getElementIterator();
while(iter.hashNext()){
Element element = (Element)iter.next();
getInfo(element);//自己調用自己 遞歸方法
}
}