[英]Parsing XML file with DOM (Java)
我想解析以下網址: http : //eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi? db= nucleotide& id= 224589801
結果,我想出了以下方法:
public void parseXml2(String URL) {
DOMParser parser = new DOMParser();
try {
parser.parse(new InputSource(new URL(URL).openStream()));
Document doc = parser.getDocument();
NodeList nodeList = doc.getElementsByTagName("Item");
for (int i = 0; i < nodeList.getLength(); i++) {
Node n = nodeList.item(i);
Node actualNode = n.getFirstChild();
if (actualNode != null) {
System.out.println(actualNode.getNodeValue());
}
}
} catch (SAXException ex) {
Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
Logger.getLogger(TaxMapperXml.class.getName()).log(Level.SEVERE, null, ex);
}
}
使用這種方法,我可以獲取Item節點的值,但不能獲取其任何屬性。 我嘗試使用NamedNodeMap使用getAttribute()進行實驗,但仍然無濟於事。
為什么我必須要做n.getFirstChild().getNodeValue();
獲得實際價值? n.getNodeValue()
返回的只是null嗎? 這不是違反直覺的嗎?顯然,在我的情況下,節點沒有子節點?
是否有一些更健壯且廣為接受的使用DOM解析XML文件的方式? 我的文件最多不會有15-20行,因此SAX是不必要的(或者是?)
XML標記包圍的文本值也被視為DOM中的Node。 這就是為什么必須在獲取值之前獲取文本Node的原因。 如果嘗試計算<Item>
的節點數,則將看到只要有文本,就會有一個節點。
XOM具有更直觀的界面,但沒有org.w3c.dom.*
界面。
如果要使用內置解析器,則應查看http://www.java-samples.com/showtutorial.php?tutorialid=152
您嘗試使用的DOMParser
是適當的,並且不可移植。
import java.io.IOException;
import java.net.URL;
import org.apache.xerces.parsers.DOMParser;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class XMLParser {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
parseXml2("http://eutils.ncbi.nlm.nih.gov/entrez/eutils/esummary.fcgi?db=nucleotide&id=224589801");
}
public static void parseXml2(String URL) {
DOMParser parser = new DOMParser();
try {
parser.parse(new InputSource(new URL(URL).openStream()));
Document doc = parser.getDocument();
NodeList nodeList = doc.getElementsByTagName("Item");
for (int i = 0; i < nodeList.getLength(); i++) {
System.out.print("Item "+(i+1));
Node n = nodeList.item(i);
NamedNodeMap m = n.getAttributes();
System.out.print(" Name: "+m.getNamedItem("Name").getTextContent());
System.out.print(" Type: "+m.getNamedItem("Type").getTextContent());
Node actualNode = n.getFirstChild();
if (actualNode != null) {
System.out.println(" "+actualNode.getNodeValue());
} else {
System.out.println(" ");
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
完成示例代碼,並添加了幾行以獲取屬性。
盡管我認為您需要了解DOM的基本概念,但這應該可以幫助您入門。 該網站(以及許多其他網站)可以為您提供幫助。 最重要的是了解其中存在的各種節點。
xml元素內的文本位於文本節點中,因為子元素可以與文本混合。 例如:
...
<A>blah<B/>blah</A>
...
元素A具有三個子元素:一個文本節點,元素B,另一個文本節點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.