XML中声明DTD、XML解析、什么是反射?

XML中声明DTD、XML解析、什么是反射?

绿林寻猫
2021-12-08 / 0 评论 / 112 阅读 / 正在检测是否收录...

什么是格式良好XML

  1 有且只有一个根元素

  2 XML标签大小写正确区分

  3 正确使用结束标签

  4 正确嵌套标签

  5 使用了合法的标签名

  6 定义有效的属性

 

XML中声明DTD

<!Doctype root[]>

 

定义元素的语法

<!ELEMENT element-name (type)>

元素的分类

element-name:元素名称

<!ELEMENT element-name EMPTY>  //空元素

<!ELEMENT element-name (#PCDATA)> //文本元素

<!ELEMENT element-name (e1,e2)> //混合元素,标签里包含了其他的元素

 

元素的限制

, :顺序

| :或

次数: +(1~n)    *(0~n)    ?(0或1)    没有(1)

 

 

 

属性定义的语法

att_name:属性名

<!ATTLIST element-name

att_name  type

>

 

类型:

ID :唯一

(男|女) :列表

:默认值

CDATA    :文本

IDREF :外键

#REQUIRED :不为空

#IMPLIED    :允许为空

 

XML中的特殊符号

& (逻辑与) &

> (大于) <

< (小于) >

(双引号) "

(单引号) '

 

DTD列子:

config.xml文件

 

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE config[

<!ELEMENT config (action*)>

<!ELEMENT action (forward*)>

<!ELEMENT forward EMPTY>

<!ATTLIST action

  path CDATA #REQUIRED

  type CDATA #REQUIRED

>

<!ATTLIST forward

  name CDATA #REQUIRED

  path CDATA #REQUIRED

  redirect (true|false) "false"

>

]>

<!--config标签:可以包含0~N个action标签 -->

<config>

<!-- action标签:可以饱含0~N个forward标签 path:以/开头的字符串,并且值必须唯一 非空 type:字符串,非空 -->

<action path="/regAction" type="test.RegAction">

<!-- forward标签:没有子标签; name:字符串,同一action标签下的forward标签name值不能相同 ; path:以/开头的字符串

redirect:只能是false|true,允许空,默认值为false -->

<forward name="failed" path="/reg.jsp" redirect="false" />

<forward name="success" path="/login.jsp" redirect="true" />

</action>

 

<action path="/loginAction" type="test.LoginAction">

<forward name="failed" path="/login.jsp" redirect="false" />

<forward name="success" path="/main.jsp" redirect="true" />

</action>

</config>

 

 

 

 

 

 

 

 

 

XML的作用:

配置:

*.properties

*.XML

 

 

数据交换

XML

Webservice

Json

 

 

JAVA配置文件的三种配置位置及读取方式

 

XML和*.properties(属性文件)

 

存储位置

src根目录下

     Xxx.class.getResourceAsStream("/config.properties");

与读取配置文件的类在同一包

     Xxx.class.getResourceAsStream("config2.properties");

WEB-INF(或其子目录下)

     ServletContext application = this.getServletContext();

 InputStream is = application.getResourceAsStream("/WEB-INF/config3.properties");

 

 

 

 

XML解析

1.properties

//输入流                 类名.class.getResourceAsStream 填写配置文件的地址

// /db.properties为src目录下

InputStream is = Test.class.getResourceAsStream("/db.properties");

//解析

Properties properties = new Properties();

properties.load(is);

 

//键值对的存储方式,根据键的名称获得值

 

Stringuname = properties.getProperty("uname");

String user = properties.getProperty("user");

String password = properties.getProperty("password");

System.out.println(uname+"  "+user+"  "+password);

 

 

2.xml

InputStream is = Test.class.getResourceAsStream("/students.xml");

 

SAXReader saxReader = new SAXReader();

Document read = saxReader.read(is);

 

Stringxpath="/students/student";

 

//得到xml文件里students下所有student元素节点

List<Node>li = read.selectNodes(xpath);

for (Node node :li) {

//student元素节点

Element studentElement = (Element) node;

 

// 1.得到student中的sid属性节点

Attribute sidAttribute = studentElement.attribute("sid");

//得到sid中的文本节点

Stringsid = sidAttribute.getText();

 

// 2.得到student中sid属性节点里的文本节点

Stringsid = studentElement.attributeValue("sid");

 

//student下的name元素节点

Element nameElement = (Element)studentElement.selectSingleNode("name");

//得到name元素节点中的文本节点

String name = nameElement.getText();

System.out.println(sid+","+name);

}

 

//得到某个元素节点

InputStream is =Test.class.getResourceAsStream("/students.xml");

 

SAXReader saxReader =new SAXReader();

Documentread = saxReader.read(is);

//得到student元素节点下一个sid为s003的name元素节点

String xpath="/students/student[@sid='s003']/name";

ElementnameElement = (Element)read.selectSingleNode(xpath);

System.out.println(nameElement.getText());

0

评论 (0)

取消