本文目录一览:
java如何从xml文件中读取一个值
java读取xml信息常用技术有dom解析和dom4J解析 dom4j是最常用的java解析xml技术,在使用时需要下载dom4j.jar 具体解析方法可以参考一下内容 xml结构
books
book id="001"
titleHarry Potter/title
authorJ K. Rowling/author
/book
book id="002"
titleLearning XML/title
authorErik T. Ray/author
/book
/books
解析为List集合
import java.io.File;
import java.util.List;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Demo {
public static void main(String[] args) throws Exception {
SAXReader reader = new SAXReader();
File file = new File("books.xml");
Document document = reader.read(file);
Element root = document.getRootElement();
List<Element> childElements = root.elements();
for (Element child : childElements) {
// 未知属性名情况下
/*
List<Attribute> attributeList = child.attributes();
for (Attribute attr : attributeList) {
System.out.println(attr.getName() + ": " + attr.getValue());
}
*/
// 已知属性名情况下
System.out.println("id: " + child.attributeValue("id"));
// 未知子元素名情况下
/*
List<Element> elementList = child.elements();
for (Element ele : elementList) {
System.out.println(ele.getName() + ": " + ele.getText());
}
System.out.println();
*/
// 已知子元素名的情况下
System.out.println("title" + child.elementText("title"));
System.out.println("author" + child.elementText("author"));
// 这行是为了格式化美观而存在
System.out.println();
}
}
}
java解析xml有几种方法
DOM(Document Object Model)解析
优点
- 允许应用程序对数据和结构做出更改
- 访问是双向的,可以在任何时候在树中上、下导航获取、操作任意部分的数据 缺点
- 解析XML文档的需要加载整个文档来构造层次结构,消耗内存资源大。 应用范围
- 遍历能力强,常应用于XML文档需要频繁改变的服务中。 解析步骤
- 创建一个
DocumentBuilderFactory
对象 - 创建一个
DocumentBuilder
对象 - 通过
DocumentBuilder
的parse()
方法加载 XML 到当前工程目录下 - 通过
getElementsByTagName()
方法获取所有 XML 所有节点的集合 - 遍历所有节点
- 通过
item()
方法获取某个节点的属性 - 通过
getNodeName()
和getNodeValue()
方法获取属性名和属性值 - 通过
getChildNodes()
方法获取子节点,并遍历所有子节点 - 通过
getNodeName()
和getTextContent()
方法获取子节点名称和子节点值
package Paint;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class DOMTest {
public static void main(String[] args) {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
try {
DocumentBuilder db = dbf.newDocumentBuilder();
Document document = db.parse("./src/Paint/hello.xml");
NodeList bookList = document.getElementsByTagName("book"); // 节点集
int bookCnt = bookList.getLength();
System.err.println("一共获取到" + bookCnt + "本书");
for (int i = 0; i < bookCnt; i++) {
Node book = bookList.item(i);
NamedNodeMap attrs = book.getAttributes();
for (int j = 0; j < attrs.getLength(); j++) {
Node attr = attrs.item(j);
System.err.println(attr.getNodeName() + "---" + attr.getNodeValue()); // id
}
NodeList childNodes = book.getChildNodes();
for (int k = 0; k < childNodes.getLength(); k++) {
if (childNodes.item(k).getNodeType() == Node.ELEMENT_NODE) {
System.out.println(childNodes.item(k).getNodeName() + "---" + childNodes.item(k).getTextContent());
}
}
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
SAX(Simple API for XML)解析
优点
- 不需要等待所有的数据被处理,解析就可以开始
- 只在读取数据时检查数据,不需要保存在内存中
- 可以在某一个条件满足时停止解析,不必要解析整个文档
- 效率和性能较高,能解析大于系统内存的文档 缺点
- 解析逻辑复杂,需要应用层自己负责逻辑处理,文档越复杂程序越复杂
- 单向导航,无法定位文档层次,很难同时访问同一文档的不同部分数据,不支持 XPath 解析步骤
- 获取一个
SAXParserFactory
的实例 - 通过 factory() 获取
SAXParser
实例 - 创建一个 handler() 对象
- 通过 parser 的 parse() 方法来解析 XML SAXTest.java
package Paint;
import java.io.IOException;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.SAXException;
public class SAXTest {
public static void main(String[] args) {
// 获取实例
SAXParserFactory factory = SAXParserFactory.newInstance();
try {
SAXParser parser = factory.newSAXParser();
SAXParserHandler handler = new SAXParserHandler();
parser.parse("./src/Paint/hello.xml", handler);
System.err.println("共有" + handler.getBookList().size() + "本书");
for (Book book : handler.getBookList()) {
System.out.println(book.getName());
System.out.println("id=" + book.getId());
System.out.println(book.getAuthor());
System.out.println(book.getYear());
System.out.println(book.getPrice());
System.out.println(book.getLanguage());
}
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
SAXParserHandler.java
package Paint;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class SAXParserHandler extends DefaultHandler {
String value = null;
Book book = null;
private ArrayList<Book> bookList = new ArrayList<Book>();
public ArrayList<Book> getBookList() {
return bookList;
}
/**
* XML 解析开始
*/
public void startDocument() throws SAXException {
super.startDocument();
System.out.println("xml 解析开始");
}
/**
* XML 解析结束
*/
public void endDocument() throws SAXException {
super.endDocument();
System.out.println("xml 解析结束");
}
/**
* 解析 XML 元素开始
*/
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
super.startElement(uri, localName, qName, attributes);
if (qName.equals("book")) {
book = new Book();
for (int i = 0; i < attributes.getLength(); i++) {
System.out.println(attributes.getQName(i) + "---" + attributes.getValue(i));
if (attributes.getQName(i).equals("id")) {
book.setId(attributes.getValue(i));
}
}
} else if (!qName.equals("bookstore")) {
System.out.print("节点名:" + qName + "---");
}
}
/**
* 解析 XML 元素结束
*/
public void endElement(String uri, String localName, String qName) throws SAXException {
super.endElement(uri, localName, qName);
if (qName.equals("book")) {
bookList.add(book);
book = null;
} else if (qName.equals("name")) {
book.setName(value);
} else if (qName.equals("year")) {
book.setYear(value);
} else if (qName.equals("author")) {
book.setAuthor(value);
} else if (qName.equals("price")) {
book.setPrice(value);
} else if (qName.equals("language")) {
book.setLanguage(value);
}
}
public void characters(char[] ch, int start, int length) throws SAXException {
super.characters(ch, start, length);
// 获取节点值数组
value = new String(ch, start, length);
if (!value.trim().equals("")) {
System.out.println("节点值:" + value);
}
}
}
JAVA 读取XML文件
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XmlTester {
public static void main(String[] args) throws DocumentException {
// 使用了dom4j解析xml
// 读取目录下用来测试的test.xml文件,取得xml主内容
Document document = new SAXReader().read("src/abc/test.xml").getDocument();
int i = 1;
// 遍历文档根节点(wuxialist)下的子节点列表,即txtbook节点的集合
for (Element txtbook : (List<Element>) document.getRootElement().elements()) {
// 取得txtbook节点下的name节点的内容
System.out.println(i + "." + txtbook.element("name").getText());
i++; // 原来这里少些了这一行,先补上
}
}
}
java如何读取xml文件
xml解析还是用dom4j方便,
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class XMLPaser {
public static void main(String[] args) {
paserXML();
}
public static void paserXML() {
SAXReader reader = new SAXReader();
try {
// 读取XML文件
Document doc = reader.read("NewFile.xml");
Element root = doc.getRootElement();
System.out.println(root.getName());
List<Element> param = root.elements();
for (Element element : param) {
if (element.attributeValue("name").equals("a")) {
System.out.println(element.getText());
}
}
} catch (DocumentException e) {
e.printStackTrace();
}
}
}