xml

xml申明

申明xml

XML实体引用

实体引用对应符号说明
&lt ;<小于(空格都要去掉)
&gt ;>大于
&amp ;&和号
&apos ;单引号
&quot ;"双引号

CDATA标签

CDATA 指的是不应由XML解析器进行解析的文本数据
从"<![CDATA[ " 开始,到"]]>" 结束

XML语义约束

xml语义约束有两种定义方式:"DTD 与"XML Schema

Document Type Definition(DTD)

是一种简单的语义约束方式,扩展名为 .dtd 。

利用DTD中的"<!ELEMENT>标签,定义XML文档中允许出现的节点及数量,例子如下:

定义hr节点下只允许出现1个employee子节点。
<!ELEMENT hr (employee)>

employee节点下必须包含以下四个节点,且按顺序出现。
<!ELEMENT employee (name,age,salary,de[partment)>

定义name标签体只能是文本,#PCDATA代表文本元素
<!ELEMENT name(#PCDATA)>

DTD定义节点数量:

hr节点下最少出现一个employee子节点
<!ELEMENT hr (employee+)>

hr节点下可能出现0....n个employee子节点。
<!ELEMENT hr (employee*)>

hr节点下最多出现1个mployee子节点
<!ELEMENT hr (employee?)>

在XML中使用<!DOCTYPE>标签来引用DTD文件:
书写格式:

<!DOCTYPE 根节点 SYSTEM “dtd文件路径”>

属性设定

<!ATTLIST 节点 属性名 CDATA "">:
<!ATTLIST employee no  CDATA "">

XML Schema

< element name=“跟节点” minOccurs=“1” maxOccurs=“999”>声明跟节点 ,min最少出现1次,max最多出现999个
< complexTYpe>复杂节点,包含子节点时必须使用这个标签
< sequence>序列,里面子节点必须按顺序书写
< attribute name=“属性名” type=“类型” use=“required”(use后的是 必须存在)>定义属性
< simpleType>简单类型约束
< restriction base=“类型”>限制
< minInclusive value=“数字”>最小值
< maxInclusive value=“数字”>最大值

例子:

<element name="hr">
                <complexType>
                    <sequence>
                        <element name="employee" minOccurs="1" maxOccurs="999">
                            <complexType>
                                <sequence>
                                    <element name="name" type="string">

                                    </element>
                                    <element name="age" >
                                    	<simpleType>
                                            <restriction base="integer">
                                                <minInclusive value="18"></minInclusive>
                                                <maxInclusive value="60"></maxInclusive>
                                            </restriction>
                                        </simpleType>
                                    </element>
                                    <element name="salary" type="integer"></element>
                                    <element name="department">
                                        <complexType>
                                            <sequence>
                                                <element name="daname" type="string"></element>
                                                <element name="address" type="string"></element>
                                            </sequence>
                                        </complexType>
                                    </element>
                                </sequence>
                                <attribute name="no" type="string" use="required"></attribute>
                            </complexType>
                        </element>
                    </sequence>
                </complexType>
            </element>

在XML中引用DTD文件:
书写格式:
< 跟命名 xmlns:xsl=“http://www.w3.org/2001/XMLSchema-instance” xsi:noNamespaceSchemaLocation=“文件地址”>

< hr xmlns:xsl="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="hr.xsd">

dom4j解析 xml

SAXReader将XML解析后以树的形式保存在内容中
.element(“标签名”)用于获取唯一的子节点对象
.getText()用于获取便签文本
.elementText(“标签”)获取子节点的文本
attribute(“属性名”)获取属性的值
.getRootElement()获取根节点

例子:


/**
 * Created by 宋 on 2021/4/1.
 */
public class HrReader {
    public void readXml(){
        String file ="f:/ij_diama/school/src/hr.xml";
        SAXReader reader =new SAXReader();

        try {
            Document document=reader.read(file);
            //获取XML文档的根节点,及hr标签
            Element root=document.getRootElement();
            List<Element> employees =root.elements("employee");
            for (Element employee:employees){
                //element方法用于获取唯一的子节点对象
                Element name = employee.element("name");
                String empName= name.getText();//getText()方法用于获取便签文本
                System.out.println(empName);
                System.out.println(employee.elementText("age"));//简写
                
				Element department = employee.element("department");
                System.out.println(department.element("dname").getText());
                //获取属性内的值
				Attribute att =employee.attribute("no");
                System.out.println(att.getText());
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        HrReader reader =new HrReader();
        reader.readXml();
        //System.exit(0);
    }
}

例用dom4j 更新 XML

.addElement()添加一个节点
.addAttribute(“属性名”,“值”)t添加一个属性
.addElement(“标签名”)添加一个标签
.setText(“文本”)添加内容
document.write()把内存的更新写入文件

例子:

public class HrWriter {
    public void writeXml(){
        String file = "f:/ij_diama/school/src/hr.xml";
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(file);
            Element root = document.getRootElement();
            Element employee = root.addElement("employee");
            employee.addAttribute("no", "3311");
            Element name = employee.addElement("name");
            name.setText("李铁柱");
            employee.addElement("age").setText("37");
            employee.addElement("salary").setText("3600");
            Element department = employee.addElement("department");
            department.addElement("dname").setText("人事部");
            department.addElement("address").setText("XX大厦-B105");
            //文件输出流
            Writer writer = new OutputStreamWriter(new FileOutputStream(file) , "UTF-8");
            document.write(writer);
            writer.close();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    public static void main(String[] args) {
        HrWriter hrWriter = new HrWriter();
        hrWriter.writeXml();
    }
}

XPath路径表达式

最常用的基本表达式

表达式描述
nodename选取此节点的所有子节点
/从根节点选取
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置
.选取当前节点的父节点
. .选取当前节点的父节点
@选取属性

案例

路径表达式结果
bookstore选取bookstroe元素的说有子节点
/bookstore选取根元素bookstore(假如路径起始于斜杠【/】,则此路径始终代表到某元素的绝对路径)
bookstore/book选取bookstore的子元素所有的book元素
//book选取所有book子元素,不管它位置
bookstore//book选择属于bookstore元素后代的所有book元素,而不管它们位于bookstore下的什么位置
//@lang选取lang的所有属性

谓语表达式:

路径表达式结果
/bookstore/book[1]选取属于bookstore子元素的第一个book元素
/bookstore/book[last()]选取属于bookstore子元素的最后一个book元素
/bookstore/book[last()-1]选取属于bookstore子元素的倒数第二个book元素
/bookstore/book[position() < 3]选取最前面的两个属于bookstore元素的子元素book元素
//title[@lang]选取所有名为lang的属性的title元素
//title[@lang=‘eng’]选取所有title元素,且这些元素拥有值为eng 的 lang 属性
/bookstore/book[price>35.00]选取bookstore元素的所有book元素,且其中的price 元素的值必须大于35.00
/bookstore/book[price>35.00]/title选取bookstore元素的中book元素的所有title元素,且其中的price 元素的值必须大于35.00

获取信息

函数作用
.selectNodes(参数)执行XPath ,返回一个list集合,指向节点为Node
.attributeValue(“属性名”)直接获取属性名中的值

例子:

/**
 * Created by 宋 on 2021/4/1.
 */
public class XPathTestor {
    public void  xpath(String xpathExp){
        String file ="f:/ij_diama/school/src/hr.xml";
        SAXReader reader =new SAXReader();
        try {
            Document document=reader.read(file);
            List<Node> nodes =document.selectNodes(xpathExp);
            for (Node node :nodes){
                Element emp =(Element)node;//node为父类要强制转换
                System.out.println(emp.attributeValue("no"));
                System.out.println(emp.elementText("name"));
                System.out.println(emp.elementText("age"));
                System.out.println(emp.elementText("salary"));
                System.out.println("====================");
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        XPathTestor xPathTestor=new XPathTestor();
        //xPathTestor.xpath("/hr/employee");
       //xPathTestor.xpath("//employee");
        //xPathTestor.xpath("//employee[salary<4000]");
        // xPathTestor.xpath("//employee[name='李天柱']");
        //xPathTestor.xpath("//employee[@no=3304]");
        //同时获取第3 和第8 的员工
        xPathTestor.xpath("//employee[3] | //employee[8]");
    }
}

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值