本文目录一览:
- java XML解析详解
- 如何用java封装解析一个多层次的XML文件,急求大神帮助
- java的xml的解析方式有什么,他们的解析流程是怎么样的,有什么区别
- 请问谁知道Java中如何解析XML文件?
- java解析嵌套xml??
java XML解析详解
(I) Java通过DOM解析XML
- 得到DOM解析器的工厂实例
获取DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
javax.xml.parsers.DocumentBuilderFactory
类的实例,即解析器工厂。 - 从DOM工厂获得DOM解析器
通过DocumentBuilder dombuilder = domfac.newDocumentBuilder();
DocumentBuilderFactory
的静态方法newDocumentBuilder()
获取DOM解析器。 - 把要解析的XML文档转化为输入流
InputStream is = new FileInputStream("bin/library.xml");
InputStream
是一个接口。 - 解析XML文档的输入流,得到一个Document
得到Document doc = dombuilder.parse(is);
org.w3c.dom.Document
对象,后续操作均基于此对象。 - 得到XML文档的根节点
根节点是Element root = doc.getDocumentElement();
org.w3c.dom.Element
类型。 - 得到节点的子节点
使用NodeList books = root.getChildNodes(); for (int i = 0; i < books.getLength(); i++) { Node book = books.item(i); }
NodeList
接口存放子节点。 - 取得节点的属性值
String email = book.getAttributes().getNamedItem("email").getNodeValue(); System.out.println(email);
- 轮循子节点
for (Node node = book.getFirstChild(); node != null; node = node.getNextSibling()) { if (node.getNodeType() == Node.ELEMENT_NODE) { if (node.getNodeName().equals("name")) { String name = node.getFirstChild().getNodeValue(); ... } if (node.getNodeName().equals("price")) { String price = node.getFirstChild().getNodeValue(); ... } } }
Java通过SAX解析XML
Simple API for XML (SAX) 是一个事件驱动的解析器API。
示例XML结构:
<person>
<user>
<username>谢成志</username>
<password>6626310xie</password>
<sex>男</sex>
<birthday>1988/11/28</birthday>
<headpic>
<pictitle>ermao</pictitle>
<picurl>images/head1.jpg</picurl>
</headpic>
</user>
</person>
Java代码示例:
public class Sax4XML {
public static void main(String[] args) {
try {
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
SaxUtil su = new SaxUtil();
parser.parse(new File("src/user-params.xml"), su);
System.out.println(su.getUser());
} catch (Exception e) {
e.printStackTrace();
}
}
}
监听器类 SaxUtil
示例:
public class SaxUtil extends DefaultHandler {
private User user;
private HeadPic headPic;
private String content;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
@Override
public void characters(char[] ch, int start, int length) throws SAXException {
content = new String(ch, start, length);
}
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if ("user".equals(name)) {
user = new User();
} else if ("headpic".equals(name)) {
headPic = new HeadPic();
}
}
@Override
public void endElement(String uri, String localName, String name) throws SAXException {
if ("username".equals(name)) {
user.setUsername(content);
} else if ("password".equals(name)) {
user.setPassword(content);
} else if ("sex".equals(name)) {
user.setSex(content);
} else if ("birthday".equals(name)) {
try {
user.setBirthday(sdf.parse(content));
} catch (ParseException e) {
e.printStackTrace();
}
} else if ("pictitle".equals(name)) {
headPic.setPicTitle(content);
} else if ("picurl".equals(name)) {
headPic.setPicUrl(content);
user.setHeadPic(headPic);
}
}
public User getUser() {
return user;
}
}
优点
- 节约内存开销
SAX解析器内存使用量远低于DOM解析器,适合处理大文件。 - 解析速度快
事件驱动机制使得处理速度更快。
缺点
- 无法访问整份文档
验证某些XML结构(如ID/IDREF)时,需要手动维护。 - 单向解析
无法回溯,只能顺序处理。 - 只读解析
无法修改XML内容。
如何用java封装解析一个多层次的XML文件,急求大神帮助
示例代码:使用XStream进行对象与XML转换
public class SwitchXML {
private XStream xStream = new XStream();
private String xmlPath = "D:/data.xml";
// 1. obj -> xml
public String printXML(User user) {
System.out.println("obj - xml");
String xml = xStream.toXML(user);
System.out.println(xml);
return xml;
}
// 2. xml -> obj
public void printObj(String xml) {
System.out.println("xml - obj");
User u = (User) xStream.fromXML(xml);
System.out.println(u.getUserName() + " " + u.getPassWord() + " " + u.getRegisteredTime());
}
// 3. obj -> xml 写入文件
public void writerXML(User user) {
try {
FileOutputStream fs = new FileOutputStream(xmlPath);
xStream.toXML(user, fs);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
// 4. 读取XML文件 -> obj
public void readerXML() {
User user = new User();
FileInputStream fis = null;
try {
fis = new FileInputStream(xmlPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
xStream.fromXML(fis, user);
System.out.println(user.toString());
System.out.println(user.getUserName() + "-" + user.getPassWord() + "-" + user.getRegisteredTime());
}
public static void main(String[] args) {
String username = "admin";
String password = "admin";
Date now = new Date();
SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
String registeredtime = format.format(now);
User user = new User(username, password, registeredtime);
SwitchXML switchXML = new SwitchXML();
String xml = switchXML.printXML(user);
System.out.println("---------------------");
switchXML.printObj(xml);
System.out.println("---------------------");
switchXML.writerXML(user);
System.out.println("---------------------");
switchXML.readerXML();
}
}
java的xml的解析方式有什么,他们的解析流程是怎么样的,有什么区别
四种解析方式:
- SAX解析
- 解析方式:事件驱动。
- 优点:
- 节省内存。
- 解析速度快。
- 缺点:
- 单向解析,无法回溯。
- 无法修改XML内容。
- DOM解析
- 解析方式:加载整个文档到内存。
- 优点:
- 可修改文档内容。
- 支持双向访问。
- 缺点:
- 内存消耗大。
- JDOM解析
- 特点:简化DOM API,使用Java集合类。
- 优点:
- 简单易用。
- 缺点:
- 灵活性差。
- 性能一般。
- DOM4J解析
- 特点:JDOM的分支,功能更强大。
- 优点:
- 性能优异。
- 支持XPath、XML Schema。
- 缺点:
- 学习曲线略高。
请问谁知道Java中如何解析XML文件?
DOM解析示例:
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.DocumentBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
public class DOMExample {
public static void main(String[] args) throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse("example.xml");
NodeList list = doc.getElementsByTagName("title");
for (int i = 0; i < list.getLength(); i++) {
System.out.println(list.item(i).getTextContent());
}
}
}
java解析嵌套xml??
示例代码:
NodeList origNodeList = doc.getElementsByTagName("orig");
NodeList emNodeList = doc.getElementsByTagName("em");
origNodeList.item(0).removeChild(emNodeList.item(0));
System.out.println(origNodeList.item(0).getTextContent());