xml中的属性赋值 java-java 反射为属性赋值
提示:学习使用,仅供参考!
目录
一、解析
使用程序去读取序读取XML中的数据
二、分类 2.1 SAX 解析
基于事件驱动的解析方式,采用串行读取方式,逐行读取,读取一行解析一行。
优:性能好,属于事件驱动型解析xml中的属性赋值 java,解析逐行解析,解析速度快
缺:不能重复使用数据,如果要修改,或者回头查找数据,必须重新从头读取一次
2.2 DOM 解析
官方定义的一套规则,把整个XML读取到内存,以树型结构来存储
优:重复使用
缺:解析速度慢,只能解析小型xml
DOM解析解析文档对象模型
三、方式
几乎所有的解析实现,都结合了解析的两种分类
3.1 jdom
// 工厂对象
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
// DocumentBuilder对象
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
// 输入流
InputStream in = JdomTest.class.getClassLoader().getResourceAsStream("book.xml");
// Document对象
Document document = documentBuilder.parse(in);
// 获取根元素
Element root = document.getDocumentElement();
// 获得节点元素
NodeList bookList = root.getElementsByTagName("book");
// 获得第一个本书
Element student = (Element) studentList.item(0);
// 获得第一本书的姓名
Node stuName = student.getElementsByTagName("name").item(0);
String textContent = stuName.getTextContent();
3.2 dom4j
通过SAX方式读取XMLxml中的属性赋值 java,形成一个DOM存储在内存里面
SAXReader类
方法名说明
SAXReader()
创建 DOM4J 解析器对象
read( url ):Document
加载XML文档,生成Document对象
Document
方法名说明
getRootElement() :Element
获得 XML 文档的根元素对象
ELement
方法名说明
elements() :List< Element >
获得当前 element 下的所有子元素
elements(String name):List< Element >
获得当前 element 下指定名字为 name 的子元素集合
element(String name):Element
返回当前 element 下指定名字为 name 的第一个子元素
getName():String
获得当前 element 的名字
attributeValue(String name):String
获取属性名为 name 的属性值
elementText(子元素名):String
获得当前元素指定名字的子元素的文本内容
getText():String
得到当前元素的文本内容
主要步骤:
// 获得资源文档的输入流
InputStream in = Dom4jTest.class.getClassLoader().getResourceAsStream("book.xml");
// 生成 document 对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(in);
// 获得根元素对象
Element root = document.getRootElement();
// 获得 root 下元素名为 "book" 的所有子节点
List<Element> books = root.elements("book");
// 获得 root 下的所有子元素
List<Element> all = root.elements();
// 获得具体某个节点
Element book = (Element) books.get(0)
Element firstSubEl = root.element("book")
// 获得根元素的名字:books
String rootName = root.getName()
// 获得元素属性值
String value = book.atttributeValue("id")
// 获得子元素的文本内容:西游记
String text = book.elementText("name");
String text1 = firstSubEl.element("name").getText()
3.2.1 增强 for 循环遍历
InputStream in = Dom4JForEach.class.getClassLoader().getResourceAsStream("book.xml");
// 生成 document 对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(in);
Element root = document.getRootElement();
List<Element> elementList = root.elements("book");
List<Book> bookList = new ArrayList<>();
for (Element el : elementList) {
Book book = new Book();
book.setId(Integer.valueOf(el.element("id").getText()));
book.setName(el.element("name").getText());
book.setAuthor(el.element("author").getText());
book.setPrice(Integer.valueOf(el.element("price").getText()));
bookList.add(book);
}
3.2.2 迭代器遍历
InputStream in = Dom4JForEach.class.getClassLoader().getResourceAsStream("book.xml");
// 生成 document 对象
SAXReader saxReader = new SAXReader();
Document document = saxReader.read(in);
Element root = document.getRootElement();
Iterator<Element> elIterator = root.elementIterator();
Book book = new Book();
while (elIterator.hasNext()) {
Element el = elIterator.next();
String name = el.element("name").getText();
if (name.equals(bookName)) {
book.setName(name);
book.setId(Integer.valueOf(el.element("id").getText()));
book.setAuthor(el.elementText("author"));
book.setPrice(Integer.valueOf(el.element("price").getText()));
break;
}
}
3.3 XPath 检索技术
总是使用整个XML文档,即从头到尾依次遍历解析,性能是非常低下的
而 XPath 则提供了 XML文档内检索的能力,能够根据条件在XML里面查找需要的内容、元素、节点。
步骤:
方法名说明
selectNodes(“表达式”):List< Node > or List < Element >
获得符合“表达式”的所有元素集合
selelctSingleNode(“表达式”):Node or Element(需要强转)
获得符合“表达式”的唯一元素
3.3.1 检索方案
绝对路径:selectNodes(“/根元素/子元素/孙元素/…”)
相对路径:selectNodes(“./子元素/…”)
全文检索:
属性检索: