1. 程式人生 > >java核心技術卷2-2.2 解析XML文件

java核心技術卷2-2.2 解析XML文件

解析XML文件

2018年11月25日 星期日
上午11:46

要讀入一個XML文件,首先需要一個DocumentBuilder物件,可以從DocumentBuilderFactory中得到這個物件,例如:
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
現在,可以從檔案中讀入某個文件:
File f = …
Document doc = buder.parse(f);
或者,可以用一個URL:
URL u = …
Document doc = builder.parse(u);
甚至可以指定一個任意的輸入流:
InputStream in = …
Document doc = builder.parse(in);

可以通過呼叫getDocumentElement方法來啟動對文件內容的分析,它將返回根元素。
Element root = doc.getDocumentElement();
例如,如果處理下面的文件:
<?xml version="1.0"?>



那麼呼叫getDocumentElement方法可以返回font元素。getTagName方法可以返回元素的標籤名。在前面的例子中,root.getTagName()返回字串"font"。
如果要得到該元素的字元素,請使用getChildNodes方法,這個方法返回一個型別為NodeList的集合。這個型別在標準的Java集合類建立之前就已經存在了,它有一個不同的訪問協議;item方法將得到指定索引值的項;getLength方法則提供的項的總數。像這樣可以列舉所有子元素:
NodeList children = root.getChildNodes();
for(int i =0; i < children.getLength(); i++){
Node chid = children.item(i);

}
分析字元素時要很小心仔細。例如,假設你正在處理以下文件:

Helvetica
36


你預期font有兩個子元素,但是解析器卻報告說有5個:
<和name>之間的空白字元
name元素
和之間的空白字元
size元素
之間的空白字元
如果你只希望得到子元素,那麼可以忽略空白字元:
for(int i =0; i < children.getLength(); i++){
Node child = child.item(i);
if(child instanceof Element)
{
Element childElement = (Element) child;
}
}
現在,只會看到兩個元素,它們的標籤是name和size

在分析name和size元素時,文字字串本身都包含在Text型別的位元組點中。既然知道了這些Text是唯一的元素,就可以用getFirstChild方法而不用再遍歷一個NodeList。然後可以用getData方法獲取儲存在Text節點中的字串。
for(int i =0; i < children.getLength(); i++){
Node child = child.item(i);
if(child instanceof Element)
{
Element childElement = (Element) child;
Text textNode = (Text) childElement.getFirstChild();
String text = textNode.getData().trim();
if(childElement.getTagName().equal(“name”))
name = text;
else if(childElement.getTagName().equal(“size”))
size = Interger.parseInt(text);
}
}
也可以用getLastChild方法得到最後一項元素,用getNextSibling得到下一個兄弟節點。這樣,另一種遍歷節點集的方式就是:
for(Node childNode = element.getFirstChild();
childNode != null; childNode = childnode.getNextSibling()){


}
如果要列舉節點的屬性,可以呼叫getAttributes方法。它返回一個NamedNodeMap物件,其中包含了描述屬性的Node物件。可以用和遍歷NodeLise一樣的辦法在NamedNodeMap中遍歷各子節點。呼叫getNodeName和getNodeValue方法可以得到屬性名和屬性值。
NameNodeMap attributes = element.getAtrributes();
for(int i = 0; i < atrributes.getLength(); i++){
Node attribute = attributes.item(i);
String name = attribute.getNodeName();
String value = attribute.getNodeValue();

}
或者,如果知道屬性名,則可以直接獲取相應的屬性值:
String unit = element.getAttribute(“unit”);