XML的解析
1.xml解析方式
DOM方式:Document Object Model,文檔對象模型,W3C推薦的使用方式。
SAX方式:Simple API for XML,不是官方标準,但是屬于開源社群XML-DEV,幾乎所有的XML解析器都支援。
2.xml解析開發包
JAXP:SUN公司推出的解析标準實作。
Dom4J:Dom4J開源社群提供的解析開發包(sun公司的一些技術實作都在使用,使用廣泛)。
JDom:開源組織提供的開發包。
JAXP解析開發包
1.jaxp的api
jaxp是javase的一部分
jaxp解析器主要在javax.xml.parsers包内定義
下分為4個類
dom:
.DocumentBuilder解析器類
.抽象類
.該類執行個體可以通過DocumentBuilderFactory.newDocumentBuilder()方法擷取。
.通過parsers("xml檔案路徑");解析xml檔案,傳回Document整個文檔。
4.Document為接口,父接口為Node。
5.Document中的方法getElementsByTagname(String Tagname)可以得到xml中的标簽名,傳回NodeList集合
6.createElement(String tagname);創造标簽
7.createTextNode(Strig text);創造文本節點
8.和js中一樣,可以使用appendChild(Node s); removeChild(Node s); replaceChild(Node new,Node old);方法,具體可以檢視api
9.NodeList的方法:getLength();得到集合長度。item(int x);傳回在x處的元素,傳回值為Node。
2.DocumentBuilderFactory解析器工廠
抽象類
可以通過newInstance擷取執行個體
sax:
.SaxParsers解析器類
.SaxParsersFactory解析器工廠
2.jaxp執行個體
1.解析一個xml檔案
xml檔案盒java檔案在同一個包内,my.package
xml檔案(路徑src/my/2.xml),現在需要查詢xml檔案中name标簽的值
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>SS1</name>
<age>20</age>
</p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
java檔案(路徑src/my/JAXP.java)
package my;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class JAXP {
public static void main(String args[]) throws Exception
{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("name");
for(int i=;i<nodelist.getLength();i++)
{
System.out.println("name="+nodelist.item(i).getTextContent());//getTextContent()得到标簽裡内容
}
}
}
運作後得到name标簽的值
通過上例可以看出,想要解析一個xml檔案,并查詢标簽資訊,需要幾個步驟
1.通過DocumentBuilderFactory.newInstance();方法建立DocumentBuilderFactory 對象。
2.通過DocumentBuilderFactory 對象.newDocumentBuilder();方法建立DocumentBuilder 對象。
3.通過DocumentBuilder 對象.parse(“xml檔案路徑”);方法建立Document 對象。
4.通過Document 對象.getElementsByTagName(“标簽名”);方法建立NodeList 對象。
5.通過NodeList 對象.getLength();方法周遊Node元素,并通過NodeList 對象.item(i)方法獲得所需的Node對象,再通過相應方法查詢标簽資訊(比如Node對象.getTextContent()擷取标簽内容)。
2.給xml檔案添加一個标簽
假設實作效果為在1中的xml檔案中每個人的資訊都添加一個
<sex>...</sex>
标簽
xml原檔案(路徑src/my/2.xml)
<?xml version="1.0" encoding="UTF-8"?>
<person>
<p1>
<name>SS1</name>
<age>20</age>
</p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
java檔案(路徑src/my/JAXP.java)
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
add();
}
private static void add() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("p1");
String [] sex={"男","女"};
for(int i=;i<nodelist.getLength();i++)
{
Element s1=document.createElement("sex");
Text s2=document.createTextNode(sex[i]);
s1.appendChild(s2);
nodelist.item(i).appendChild(s1);
}
//因為解析xml的機制是先在記憶體中開辟一塊記憶體,用來存放xml的解析樹,是以現在修改的還隻是記憶體中的xml解析樹,實際上對實際的xml原檔案沒有進行修改,
//是以需要将記憶體中修改過的xml回寫進檔案,才能實作原檔案的修改
TransformerFactory transformerfatory=TransformerFactory.newInstance();
Transformer transformer=transformerfatory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
}
}
修改後的xml檔案
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>男</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>女</sex></p1>
</person>
3.修改xml檔案
将2中添加标簽後的xml檔案的sex标簽内容修改掉
xml修改前(scr/my/2.xml),将sex标簽中的男女值對調
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>男</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>女</sex></p1>
</person>
java檔案
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
changeSex();
}
private static void changeSex() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("sex");
String [] sex={"女","男"};
for(int i=;i<nodelist.getLength();i++)
{
nodelist.item(i).setTextContent(sex[i]);
}
//回寫xml
TransformerFactory transformerfatory=TransformerFactory.newInstance();
Transformer transformer=transformerfatory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
}
}
修改後的xml檔案
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>女</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>男</sex></p1>
</person>
4.删除xml中的标簽
将3中的xml檔案中的sex标簽删去
删除前的xml檔案(scr/my/2.xml)
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age>
<sex>女</sex></p1>
<p1>
<name>SS2</name>
<age>21</age>
<sex>男</sex></p1>
</person>
java檔案
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
deleteSex();
}
private static void deleteSex() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
NodeList nodelist=document.getElementsByTagName("p1");
for(int i=;i<nodelist.getLength();i++)
{
// Node parent=nodelist.item(i).getParentNode();
nodelist.item(i).removeChild(nodelist.item(i).getLastChild());
}
//回寫xml
TransformerFactory transformerfatory=TransformerFactory.newInstance();
Transformer transformer=transformerfatory.newTransformer();
transformer.transform(new DOMSource(document), new StreamResult("src/my/2.xml"));
}
}
删除sex标簽的xml檔案
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age></p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
對xml的元素進行周遊
xml檔案
<?xml version="1.0" encoding="UTF-8" standalone="no"?><person>
<p1>
<name>SS1</name>
<age>20</age></p1>
<p1>
<name>SS2</name>
<age>21</age>
</p1>
</person>
java檔案
package my;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.Text;
import org.xml.sax.SAXException;
public class JAXP {
public static void main(String args[]) throws Exception
{
listElement();
}
private static void listElement() throws Exception{
DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
Document document=documentbuilder.parse("src/my/2.xml");
// Node node=document;
// NodeList nodelist=node.getChildNodes();//得到一層子節點(在這裡就是xml的根節點了)
getNode(document,);
}
private static void getNode(Node node,int n)
{
NodeList nodelist=node.getChildNodes();
for(int i=;i<nodelist.getLength();i++)
{
for(int j=;j<n;j++)
{
System.out.print(" ");
}
if(nodelist.item(i).getNodeType()==Node.ELEMENT_NODE)
{
System.out.println(nodelist.item(i).getNodeName());
getNode(nodelist.item(i),n+);
}
}
}
}
控制台輸出
person
p1
name
age
p1
name
age