java解析嵌套xml(java函数嵌套定义)

发布时间:2022-11-14

本文目录一览:

  1. java XML解析详解
  2. 如何用java封装解析一个多层次的XML文件,急求大神帮助
  3. java的xml的解析方式有什么,他们的解析流程是怎么样的,有什么区别
  4. 请问谁知道Java中如何解析XML文件?
  5. java解析嵌套xml??

java XML解析详解

(I) Java通过DOM解析XML

  1. 得到DOM解析器的工厂实例
    DocumentBuilderFactory domfac = DocumentBuilderFactory.newInstance();
    
    获取 javax.xml.parsers.DocumentBuilderFactory 类的实例,即解析器工厂。
  2. 从DOM工厂获得DOM解析器
    DocumentBuilder dombuilder = domfac.newDocumentBuilder();
    
    通过 DocumentBuilderFactory 的静态方法 newDocumentBuilder() 获取DOM解析器。
  3. 把要解析的XML文档转化为输入流
    InputStream is = new FileInputStream("bin/library.xml");
    
    InputStream 是一个接口。
  4. 解析XML文档的输入流,得到一个Document
    Document doc = dombuilder.parse(is);
    
    得到 org.w3c.dom.Document 对象,后续操作均基于此对象。
  5. 得到XML文档的根节点
    Element root = doc.getDocumentElement();
    
    根节点是 org.w3c.dom.Element 类型。
  6. 得到节点的子节点
    NodeList books = root.getChildNodes();
    for (int i = 0; i < books.getLength(); i++) {
        Node book = books.item(i);
    }
    
    使用 NodeList 接口存放子节点。
  7. 取得节点的属性值
    String email = book.getAttributes().getNamedItem("email").getNodeValue();
    System.out.println(email);
    
  8. 轮循子节点
    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;
    }
}

优点

  1. 节约内存开销
    SAX解析器内存使用量远低于DOM解析器,适合处理大文件。
  2. 解析速度快
    事件驱动机制使得处理速度更快。

缺点

  1. 无法访问整份文档
    验证某些XML结构(如ID/IDREF)时,需要手动维护。
  2. 单向解析
    无法回溯,只能顺序处理。
  3. 只读解析
    无法修改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的解析方式有什么,他们的解析流程是怎么样的,有什么区别

四种解析方式:

  1. SAX解析
    • 解析方式:事件驱动。
    • 优点
      • 节省内存。
      • 解析速度快。
    • 缺点
      • 单向解析,无法回溯。
      • 无法修改XML内容。
  2. DOM解析
    • 解析方式:加载整个文档到内存。
    • 优点
      • 可修改文档内容。
      • 支持双向访问。
    • 缺点
      • 内存消耗大。
  3. JDOM解析
    • 特点:简化DOM API,使用Java集合类。
    • 优点
      • 简单易用。
    • 缺点
      • 灵活性差。
      • 性能一般。
  4. 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());