特殊文件更Java(properties、XML、JSON)

特殊文件更Java(properties、XML、JSON)


上接Java文件基础:https://blog.csdn.net/biggerchong/article/details/82820567

6.7.1介绍

在C++与Java中配置文件主要是XML与JSON,Eclipse中还包含自带的properties属性文件,这种属性文件可以使用Eclipse的自带的工具创建一种properties扩展的文件,它的写入和解析相对XML、JSON较为简单。

       propertiesEclipse自带属性文件,利用Java代码很方便的读取和设置;但是其可移植性弱,企业级配置文件还是以XML为主流。

       XML用来配置用户自定义或系统规定的设置信息,可以实现通过更改配置中的信息而更改程序中相应的变量配置却不必更改程序代码。(可移植性强,XML库很丰富)

       JSON是网络传输中的主要传输文件方法,当然JSON跟服务器自然就离不开了,可能这种概念最开始不会很深刻,当我接触到Java Web开发时,意识到服务器端与客户端之间的交互时利用JSON文件格式来传输的,这种传输格式非常有利于客户端,利用AJAX函数库可以直接读取,这样的页面就不会卡顿了更加友好。


6.7.2 Properties属性文件(概述)

//取得properties文件流

InputStream file=testProperties.class.getResourceAsStream("/config.properties");

proper.load(file); //将流加载到proper



//当不存在Name关键字时,取默认值

       //第二个参数是设置的默认值(可设可不设)

String Name=proper.getProperty("Name","知飞翀");

String CSDN=proper.getProperty("CSDN");

String QQ=proper.getProperty("QQ");

6.7.3 XML详解(已更新)

Java中常用dom4j.jar包来实现对XML文件的各种操作,这里使用dom4j-1.6.1.jar包,它的帮助文档(https://dom4j.github.io/javadoc/1.6.1/

XML格式:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>   <--! 必须顶格写才有效 -->

<root>

  <blog>知飞翀</blog>

  <csdn>80</csdn>

  <xxxx>你好</xxxx>

</root>

在XML第一行申明的格式中,

       version=“1.0”:表明解析此XML文件的解析器的版本;

       encoding="UTF-8": 使用UTF-8编码方式解析;(windows下保存文件默认按gbk编码方式保存)

       standalone: no,代表该XML会依赖关联其他文件(html、css等);yes,代表此XML文件是一个独立文件。

元素:root、blog、csdn、xxxx,这种放在尖括号中的元素,第一个元素为根元素root,总体呈现树状结构。

属性:定义在元素里面, <元素名称  属性名称="属性的值"></元素名称>,属性通常提供不属于数据组成部分的信息或做标识用。

text:知飞翀、80、你好,叶子元素对应的value。

CDATA区:如果某段字符串里面有过多的字符, 并且里面包含了类似标签或者关键字的这种文字,不想让xml的解析器去解析。 那么可以使用CDATA来!

    例如:<des><![CDATA[<a href="http://www.baidu.com">知飞翀</a>]]></des>

XML约束(DTD、Schema)

DTD语法自成一派, 早起就出现的。 可读性比较差;

1. 引入网络上的DTD

       <!-- 引入dtd 来约束这个xml -->

       <!--    文档类型  根标签名字 网络上的dtd   dtd的名称   dtd的路径
       <!DOCTYPE stus PUBLIC "//UNKNOWN/" "unknown.dtd"> -->

 2. 引入本地的DTD

      <!-- 引入本地的DTD  : 根标签名字 引入本地的DTD  dtd的位置 -->
      <!-- <!DOCTYPE stus SYSTEM "stus.dtd"> -->

3. 直接在XML里面嵌入DTD的约束规则

       <!-- xml文档里面直接嵌入DTD的约束法则 -->
       <!DOCTYPE stus [
           <!ELEMENT stus (stu)>
           <!ELEMENT stu (name,age)>
           <!ELEMENT name (#PCDATA)>
           <!ELEMENT age (#PCDATA)>
       ]>
       
       <stus>
           <stu>
               <name>张三</name>
               <age>18</age>
           </stu>
       </stus>


        <!ELEMENT stus (stu)>  : stus 下面有一个元素 stu  , 但是只有一个
        <!ELEMENT stu (name , age)>  stu下面有两个元素 name  ,age  顺序必须name-age
        <!ELEMENT name (#PCDATA)> 
        <!ELEMENT age (#PCDATA)>
        <!ATTLIST stu id CDATA #IMPLIED> stu有一个属性 文本类型, 该属性可有可无
      

 元素的个数:

            + 一个或多个
            *  零个或多个
            ? 零个或一个
    
        属性的类型定义 
    
            CDATA : 属性是普通文字
            ID : 属性的值必须唯一


        <!ELEMENT stu (name , age)>        按照顺序来 

        <!ELEMENT stu (name | age)>   两个中只能包含一个子元素


Schema其实就是一个xml , 使用xml的语法规则, xml解析器解析起来比较方便 , 是为了替代DTD 。但是Schema 约束文本内容比DTD的内容还要多。 所以目前也没有真正意义上的替代DTD。Schema约束要建立实例文档、约束文档。

  约束文档:
		<!-- xmlns  :  xml namespace : 名称空间 /  命名空间
		targetNamespace :  目标名称空间 。 下面定义的那些元素都与这个名称空间绑定上。 
		elementFormDefault : 元素的格式化情况。  -->
		<schema xmlns="http://www.w3.org/2001/XMLSchema" 
			targetNamespace="http://www.itheima.com/teacher" 
			elementFormDefault="qualified">
			
			<element name="teachers">
				<complexType>
					<sequence maxOccurs="unbounded">
						<!-- 这是一个复杂元素 -->
						<element name="teacher">
							<complexType>
								<sequence>
									<!-- 以下两个是简单元素 -->
									<element name="name" type="string"></element>
									<element name="age" type="int"></element>
								</sequence>
							</complexType>
						</element>
					</sequence>
				</complexType>
			</element>
		</schema>
	
实例文档:
		<?xml version="1.0" encoding="UTF-8"?>
		<!-- xmlns:xsi : 这里必须是这样的写法,也就是这个值已经固定了。
		xmlns : 这里是名称空间,也固定了,写的是schema里面的顶部目标名称空间
		xsi:schemaLocation : 有两段: 前半段是名称空间,也是目标空间的值 , 后面是约束文档的路径。
		 -->
		<teachers
			xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
			xmlns="http://www.itheima.com/teacher"
			xsi:schemaLocation="http://www.itheima.com/teacher teacher.xsd"
		>
			<teacher>
				<name>zhangsan</name>
				<age>19</age>
			</teacher>
			<teacher>
				<name>lisi</name>
				<age>29</age>
			</teacher>
			<teacher>
				<name>lisi</name>
				<age>29</age>
			</teacher>
		</teachers>

名称空间的作用

一个xml如果想指定它的约束规则, 假设使用的是DTD ,那么这个xml只能指定一个DTD  ,  不能指定多个DTD 。 但是如果一个xml的约束是定义在schema里面,并且是多个schema,那么是可以的。简单的说: 一个xml 可以引用多个schema约束。 但是只能引用一个DTD约束。名称空间的作用就是在 写元素的时候,可以指定该元素使用的是哪一套约束规则。  默认情况下 ,如果只有一套规则,那么都可以这么写<name>张三</name>,否则:

    <aa:name></aa:name>
    <bb:name></bb:name>

 

 

XML的解析

XML的解析方式常见的有两种:DOM(Document Object Model)、SAX(Simple API for XML是一种接口)

针对以上两种解析方式的API:jaxp(sun公司出品,比较繁琐)、jdom 、dom4j(由jdom分流出来,更加流行)

 

在Eclipse中利用dom4j创建XML:

              //创建Document(加载准备)

              Document x_doc=DocumentHelper.createDocument();

              //添加root根元素

              Element doc_root=x_doc.addElement("root");

              //添加子元素

              Element doc_name=doc_root.addElement("name").addText("知飞翀");

              Element doc_CSDN=doc_root.addElement("CSDN").addText("https://me.csdn.net/biggerchong");

              //添加属性

              Element name_QQ=doc_name.addAttribute("QQ", "610254602");

             

              //转成XML字符串

              x_doc.setXMLEncoding("UTF-8");

             

              //输出到文件            

              OutputFormat format= OutputFormat.createPrettyPrint();
              format.setEncoding("UTF-8"); //设置XML字符编码
              File file=new File("src/config.xml"); //设置相对路径
              try
              {
                     XMLWriter writer=new XMLWriter(new FileOutputStream(file),format);
                     writer.write(x_doc);
                     writer.close();
                     System.out.println("config.xml文件创建成功!");
              }

              catch (Exception e)
              {
                     e.printStackTrace();
              }

注:文件路径这里用的是相对路径,Document相当于是整个XML的总管,它是老大;root是老二;子元素是老小。

在Eclipse中利用dom4j解析XML:

                     //从XML文件中读出

                     FileInputStream stream=new FileInputStream("src/config.xml");

                     SAXReader reader=new SAXReader(); //用来读取文件到Document

                    

                     Document x_doc=reader.read(stream);

                     stream.close();

                     //取得根元素

                     Element doc_root=x_doc.getRootElement();

                    

                     //从子元素中取值

                       //方法1

                     Element doc_name=doc_root.element("name");

                     String name=doc_name.getText();

                       //方法2

                     String CSDN= doc_root.elementText("CSDN");

                       //方法3

                     List<Element> elements=doc_root.elements();  //获取根元素下的所有元素

                     for(Element element:elements)//遍历

                     //取得属性

                     String QQ=doc_name.attributeValue("QQ");

 

注:引入dom4j自定义的SAXReader

dom4j的Xpath的使用

dom4j里面支持Xpath的写法。 xpath其实是xml的路径语言,支持我们在解析xml的时候,能够快速的定位到具体的某一个元素。引入依赖jar包(jaxen-1.1-beta-6.jar)就可以使用Xpath来轻松查找。

             //要想使用Xpath, 还得添加支持的jar 获取的是第一个 只返回一个。 
            Element nameElement = (Element) rootElement.selectSingleNode("//name");

             //获取文档里面的所有name元素 
             List<Element> list = rootElement.selectNodes("//name");


6.7.4 JSON详解

       Java中与JSON有关的库很多,但是使用方法大同小异,这里我们在JSON官网(http://www.json.org/)中使用其中一个JSON-java的库(官方API:http://stleary.github.io/JSON-java/index.html),在github上下载整个源码后就可直接添加到src中使用了,这里我们将源码打包成json-org.jar包来使用更加方便。

JSON格式:   

 {
      “name”: “翀哥”,
     “phone”: “13277351070”
  }

在MyEclipse中利用json-org创建json:

      

 JSONObject jsonObject=new JSONObject( ); //创建JSONObject

       //向JSONObject中添加数据(key--value)

       jsonObject.put(“name”,name);

       jsonObject.put(“phone”,phone);

       String jsonStr=jsonObject.toString( ); //转换为JSON字符串传输给客户端

在MyEclipse中利用json-org解析json:

      

//传入jsonStr创建JSONObject
JSONObject jsonObject=new JSONObject(String jsonStr);

//从JSONObject中取出数据(key--value)
 String name=jsonObject.getString(“name”);
 String phone=jsonObject.getString(“phone”);

还有更多复杂的JSON格式:JSON中嵌入JSON、JSON Array等,都是按照基本方法来创建解析的。JSON中属性没有先后顺序这一说,JSON与hashMap很相似。

 

全部特殊文件jar包及源码上传至github:https://github.com/SCAsMessi/JavaStudy/tree/master/CSDN/Java%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/specailFile

加油!骚年们。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中可以使用一些库来实现 JSONXML 文件的验证,比如: 1. JSON 验证器:可以使用 json-schema-validator 库来验证 JSON 文件是否符合指定的 JSON Schema。以下是一个简单的示例: ```java import com.github.fge.jsonschema.core.exceptions.ProcessingException; import com.github.fge.jsonschema.main.JsonSchema; import com.github.fge.jsonschema.main.JsonSchemaFactory; import com.github.fge.jsonschema.core.report.ProcessingReport; import com.github.fge.jsonschema.core.report.ProcessingMessage; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.net.URL; public class JsonValidator { public static void main(String[] args) throws IOException, ProcessingException { // 读取 JSON 文件JSON Schema 文件 String jsonData = "{ \"name\": \"John\", \"age\": 30 }"; String schemaData = "{ \"type\": \"object\", \"properties\": { \"name\": { \"type\": \"string\" }, \"age\": { \"type\": \"integer\" } } }"; ObjectMapper mapper = new ObjectMapper(); JsonNode json = mapper.readTree(jsonData); JsonNode schema = mapper.readTree(schemaData); // 创建 JSON Schema 验证器 JsonSchemaFactory factory = JsonSchemaFactory.byDefault(); JsonSchema jsonSchema = factory.getJsonSchema(schema); // 验证 JSON 文件是否符合 JSON Schema ProcessingReport report = jsonSchema.validate(json); // 打印验证结果 if (report.isSuccess()) { System.out.println("JSON 文件符合 JSON Schema!"); } else { for (ProcessingMessage message : report) { System.out.println(message.getMessage()); } } } } ``` 2. XML 验证器:可以使用 javax.xml.validation 包中提供的 API 来验证 XML 文件是否符合指定的 XSD Schema。以下是一个简单的示例: ```java import java.io.File; import javax.xml.XMLConstants; import javax.xml.validation.Schema; import javax.xml.validation.SchemaFactory; import javax.xml.validation.Validator; import org.xml.sax.SAXException; public class XmlValidator { public static void main(String[] args) { // 读取 XML 文件和 XSD Schema 文件 File xmlFile = new File("example.xml"); File xsdFile = new File("example.xsd"); try { // 创建 XML 验证器 SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); Schema schema = factory.newSchema(xsdFile); Validator validator = schema.newValidator(); // 验证 XML 文件是否符合 XSD Schema validator.validate(new StreamSource(xmlFile)); // 打印验证结果 System.out.println("XML 文件符合 XSD Schema!"); } catch (SAXException e) { System.out.println("XML 文件不符合 XSD Schema:" + e.getMessage()); } catch (IOException e) { System.out.println("无法读取 XML 文件或 XSD Schema 文件:" + e.getMessage()); } } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值