zoukankan      html  css  js  c++  java
  • XML和XML解析

    1. XML文件:

    什么是XML?XML一般是指可扩展标记语言,标准通用标记语言的子集,是一种用于标记电子文件使其具有结构性的标记语言。

    2.XML文件的优点:

    1)XML文档内容和结构完全分离。 
    2)互操作性强。 
    3)规范统一。 
    4)支持多种编码。 
    5)可扩展性强。

    3.如何解析XML文档:

    XML在不同的语言中解析XML文档都是一样的,只不过实现的语法不一样,基本的解析方式有两种,一种是SAX方式,是按照XML文件的顺序一步一步解析。另外一种的解析方式DOM方式,而DOM方式解析的关键就是节点。另外还有DOM4J、JDOM等方式。本文介绍的是DOM、DOM4J方式与封装成一个工具类的方式来读取XML文档。

    4.XML文档:

    scores.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE students [
        <!ELEMENT students (student+)>
        <!ELEMENT student (name,course,score)>
        <!ATTLIST student id CDATA #REQUIRED>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT course (#PCDATA)>
        <!ELEMENT score (#PCDATA)>
    ]>
    <students>
        <student id="11">   
            <name>张三</name> 
            <course>JavaSE</course>
            <score>100</score>
        </student>
        <student id="22">       
            <name>李四</name>
            <course>Oracle</course>
            <score>98</score>
        </student>  
    </students>

    5.DOM方式解析XML

    public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
            //1.创建DOM解析器工厂
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            //2.由DOM解析器工厂创建DOM解析器
            DocumentBuilder  db = dbf.newDocumentBuilder();
            //3.由DOM解析器解析文档,生成DOM树
            Document doc = db.parse("scores.xml");
            //4.解析DOM树,获取文档内容(元素   属性  文本)
            //4.1获取根元素scores
            NodeList scoresList = doc.getChildNodes();
            Node scoresNode =   scoresList.item(1);
            System.out.println(scoresList.getLength());
            //4.2获取scores中所有的子元素student
            NodeList studentList = scoresNode.getChildNodes();
            System.out.println(studentList.getLength());
            //4.3对每个student进行处理
            for(int i=0;i<studentList.getLength();i++){
                Node stuNode = studentList.item(i);
                //System.out.println(stuNode.getNodeType());
                //输出元素的属性  id
                if(stuNode.getNodeType()==Node.ELEMENT_NODE){
                    Element elem =(Element)stuNode;
                    String id= elem.getAttribute("id");
                    System.out.println("id------>"+id);
                }
                //输出元素的子元素  name  course  score
                NodeList ncsList = stuNode.getChildNodes();
                //System.out.println(ncsList.getLength() );
                for(int j=0;j<ncsList.getLength();j++){
                    Node ncs = ncsList.item(j);
                    if(ncs.getNodeType() == Node.ELEMENT_NODE){
                            String name  = ncs.getNodeName();
                            //String value = ncs.getFirstChild().getNodeValue();//文本是元素的子节点,所以要getFirstChild
                            String value = ncs.getTextContent();
                            System.out.println(name+"----->"+value);
                    }
                }
                System.out.println();
            }
        }

    6.DOM4J方式解析XML文档:

    
        public static void main(String[] args) throws DocumentException {
            //使用dom4j解析scores2.xml,生成dom树
            SAXReader reader = new SAXReader();
            Document doc = reader.read(new File("scores.xml"));     
            //得到根节点:students
            Element root = doc.getRootElement();        
            //得到students的所有子节点:student
            Iterator<Element> it = root.elementIterator();  
    
            //处理每个student
            while(it.hasNext()){
                //得到每个学生
                Element stuElem =it.next();
                //System.out.println(stuElem);
                //输出学生的属性:id
                List<Attribute> attrList = stuElem.attributes();
                for(Attribute attr :attrList){
                    String name = attr.getName();
                    String value = attr.getValue();
                    System.out.println(name+"----->"+value);
                }
                //输出学生的子元素:name,course,score
                Iterator <Element>it2 = stuElem.elementIterator();
                while(it2.hasNext()){
                    Element elem = it2.next();
                    String name = elem.getName();
                    String text = elem.getText();
                    System.out.println(name+"----->"+text);
                }
                System.out.println();
            }   
        }

    当然,无论我们是使用那种方式解析XML的,都需要导入jar包(千万不要忘记)。

    7.我自己的方式:

    在实际开发的工程中,我们要善于使用工具类,将我们反复使用的功能封装成一个工具类,所以,下面的方式就是我在开发的过程中使用的方式.

    7.1什么是properties文件:

    7.1.1 从结构上讲:

    .xml文件主要是树形文件。 
    .properties文件主要是以key-value键值对的形式存在

    7.1.2 从灵活的角度来说:

    .xml文件要比.properties文件的灵活读更高一些。

    7.1.3 从便捷的角度来说:

    .properties文件比.xml文件配置更加简单。

    7.1.4 从应用程度上来说:

    .properties文件比较适合于小型简单的项目,因为.xml更加灵活。

    7.2自己的properties文档:

    在我自己的项目中创建了一个path.properties文件,里面用来存放我即将使用的路径,以名字=值的方式存放。例如:

    realPath = D:/file/
    • 1

    7.3 解析自己的.properties文件:

    public class PropertiesUtil {
        private static PropertiesUtil manager = null;
        private static Object managerLock = new Object();
        private Object propertiesLock = new Object();
        private static String DATABASE_CONFIG_FILE = "/path.properties";
        private Properties properties = null;
    
        public static PropertiesUtil getInstance() {
            if (manager == null) {
                synchronized (managerLock) {
                    if (manager == null) {
                        manager = new PropertiesUtil();
                    }
                }
            }
            return manager;
        }
    
        private PropertiesUtil() {
        }
    
        public static String getProperty(String name) {
            return getInstance()._getProperty(name);
        }
    
        private String _getProperty(String name) {
            initProperty();
            String property = properties.getProperty(name);
            if (property == null) {
                return "";
            } else {
                return property.trim();
            }
        }
    
        public static Enumeration<?> propertyNames() {
            return getInstance()._propertyNames();
        }
    
        private Enumeration<?> _propertyNames() {
            initProperty();
            return properties.propertyNames();
        }
    
        private void initProperty() {
            if (properties == null) {
                synchronized (propertiesLock) {
                    if (properties == null) {
                        loadProperties();
                    }
                }
            }
        }
    
        private void loadProperties() {
            properties = new Properties();
            InputStream in = null;
            try {
                in = getClass().getResourceAsStream(DATABASE_CONFIG_FILE);
                properties.load(in);
            } catch (Exception e) {
                System.err
                        .println("Error reading conf properties in PropertiesUtil.loadProps() "
                                + e);
                e.printStackTrace();
            } finally {
                try {
                    in.close();
                } catch (Exception e) {
                }
            }
        }
    
        /**
         * 提供配置文件路径
         * 
         * @param filePath
         * @return
         */
        public Properties loadProperties(String filePath) {
            Properties properties = new Properties();
            InputStream in = null;
            try {
                in = getClass().getResourceAsStream(filePath);
                properties.load(in);
            } catch (Exception e) {
                System.err
                        .println("Error reading conf properties in PropertiesUtil.loadProperties() "
                                + e);
                e.printStackTrace();
            } finally {
                try {
                    in.close();
                } catch (Exception e) {
                }
            }
            return properties;
        }
    }
  • 相关阅读:
    Hibrenate load 和 get
    用 JMX 检测应用程序
    java.lang.Class类
    JAVA方法传递参数:传值?传引用?
    Spring Task Schedule 及多线程
    Spring 3.0 注解
    Spring Batch 文档(中文)
    C#中combobox 控件属性、事件、方法
    LINQ to SQL快速上手 step by step
    C#操作字符串方法总结<转>
  • 原文地址:https://www.cnblogs.com/yirgaMonkey/p/XML.html
Copyright © 2011-2022 走看看