java如何从一个xml文件读取根节点、子节点属性。

java如何从一个xml文件读取根节点、子节点属性。,第1张

思路如下:

xml文件未知不明白什么意思?我索性就理解为一个目录下有很多xml文件,每个xml文件获取其中的bean节点属性

1> 有xml文件路径,获取该路径下的所有文件,用后缀“xml”或“XML”过滤得到xml文件。

2> javaxxmlparsersDocumentBuilder builder = factorynewDocumentBuilder();

orgw3cdomDocument doc = builderparse(is); 创建文档对象。

3>docgetChildNodes()获取文档中所有的节点,循环遍历所得节点node,

通过nodegetAttributes()获取节点所有属性,获取各个属性name和值即可,输出想要得到的数据。

或者通过docgetElementsByTagName("bean");直接指定bean节点。然后用同样的方法获取属性名和值,输出。

以上是根据jdk的W3C库解析的。想方便可以通过dom4j、jdom进行文件 *** 作。思路变化不大。

XML文件的表现:以“xml”为文件扩展名的文件;

存储结构:树形结构;

节点名称区分大小写。

1、<book id="1"></book> id为属性, <book><id>1</id></book> id为节点

2、xml文件开头要加上版本信息和编码方式<xml version="10" encoding="UTF-8">

比如:

❤ 为什么要使用XML?

思考1:不同应用程序之间的通信?

思考2:不同平台间的通信?

思考3:不同平台间的数据共享?

答案就是我们要学习的XML文件。我们可以使用相同的xml把不同的文件联系起来

回到顶部

二、应用 DOM 方式解析 XML

❤ 在Java程序中如何获取XML文件的内容

解析的目的:获取节点名、节点值、属性名、属性值;

四种解析方式:DOM、SAX、DOM4J、JDOM

DOM、SAX :java 官方方式,不需要下载jar包

DOM4J、JDOM :第三方,需要网上下载jar包

示例:解析XML文件,目标是解析XML文件后,Java程序能够得到xml文件的所有数据

思考:如何在Java程序中保留xml数据的结构?

如何保留节点之间的层级关系?

注意常用的节点类型:

下面介绍DOM方式解析XML:

功能说明:

setEscapeText(false) 只是能改变 escapeElementEntities(String st) 中的参数,主要能改变文本里面如:

<root> aaaa>bbbb <root/> 中aaaa>bbbb的中的>不转变

对于Attribute 里面的特殊字符,我查了好久的原码发现人家里面是从

protected void writeEscapeAttributeEntities(String txt) throws IOException {

if (txt != null) {

String escapedText = escapeAttributeEntities(txt);

writerwrite(escapedText);

}

}//(在XMLWriter类中第1174行)

里面有个 escapeAttributeEntities(txt); 这个是专门用来转变Attribute 里面的特殊字符的,

所以要想解决这个问题,我是用了继承,写了一个

public class MyXMLWriter extends XMLWriter {

protected void writeEscapeAttributeEntities(String txt) throws IOException {

if (txt != null) {

//String escapedText = escapeAttributeEntities(txt);

writerwrite(txt);

}

}

}

直接注释了原码中的//StringescapedText=escapeAttributeEntities(txt);

就完美解决了。

import javaioFile;

import javaioFileOutputStream;

import javautilArrayList;

import javautilList;

import javautilScanner;

import orgdom4jDocument;

import orgdom4jDocumentHelper;

import orgdom4jElement;

import orgdom4jioOutputFormat;

import orgdom4jioSAXReader;

import orgdom4jioXMLWriter;

public class Book {

    private int no;

    private String name;

    private double value;

    public Book() {

    }

    public Book(int no, String name, double value) {

        thisno = no;

        thisname = name;

        thisvalue = value;

    }

    public double getValue() {

        return value;

    }

    public void setValue(double value) {

        thisvalue = value;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        thisname = name;

    }

    public int getNo() {

        return no;

    }

    public void setNo(int no) {

        thisno = no;

    }

}

class BookList {

    private List<Book> bookList;

    public BookList() {

        bookList = readXML();

    }

    public long getCount() {

        return bookListsize();

    }

    public List<Book> getBookList() {

        return bookList;

    }

    public void setBookList(List<Book> bookList) {

        thisbookList = bookList;

    }

    public void add(Book book) {

        bookListadd(book);

    }

    public boolean delete(String name) {

        Book book = query(name);

        return bookListremove(book);

    }

    public void update(Book bookBefore, Book bookAfter) {

        bookListremove(bookBefore);

        add(bookAfter);

    }

    public Book query(String name) {

        Book temp = null;

        for (Book book : bookList) {

            if (bookgetName()equals(name)) {

                temp = book;

            }

        }

        return temp;

    }

    public synchronized void writeXmlDocument(Book book) {

        try {

            File file = new File("D:\\bookxml");

            Document document = null;

            Element root = null;

            if (!fileexists()) {

                // 新建studentxml文件并新增内容

                document = DocumentHelpercreateDocument();

                root = documentaddElement("Books");//添加根节点   

            } else {

                SAXReader saxReader = new SAXReader();

                document = saxReaderread(file);

                root = documentgetRootElement();//获得根节点

            }

            Element secondRoot = rootaddElement("Book");//二级节点   

            //为二级节点添加属性,属性值为对应属性的值   

            secondRootaddElement("no")setText(bookgetNo() + "");

            secondRootaddElement("name")setText(bookgetName() + "");

            secondRootaddElement("value")setText(bookgetValue() + "");

            OutputFormat format = OutputFormatcreatePrettyPrint();

            formatsetEncoding("GBK");

            XMLWriter writer = new XMLWriter(new FileOutputStream("D:\\bookxml"), format);

            writerwrite(document);

            writerclose();

            documentclearContent();

        } catch (Exception e) {

            eprintStackTrace();

        }

    }

    public synchronized List<Book> readXML() {

        List<Book> list = new ArrayList<Book>();//创建list集合   

        File file = null;

        try {

            file = new File("D:\\bookxml");//读取文件   

            if (fileexists()) {

                SAXReader saxReader = new SAXReader();

                Document document = saxReaderread(file);

                List nodeList = documentselectNodes("Books/Book");

                for (int i = 0; i < nodeListsize(); i++) {

                    Element el = (Element) nodeListget(i);

                    Book book = new Book();

                    booksetNo(IntegerparseInt(elelementText("no")));

                    booksetName(elelementText("name"));

                    booksetValue(DoubleparseDouble(elelementText("value")));

                    listadd(book);

                }

            }

        } catch (Exception e) {

            eprintStackTrace();

        }

        return list;

    }

}

class Test {

    public static void main(String args[]) {

        BookList bl = new BookList();

        boolean bBreak = true;

        while (bBreak) {

            Systemoutprintln("请输入 *** 作代码:");

            Systemoutprintln("1:添加 2:删除 3:修改 4:查询 5:书籍统计 6:退出");

            Scanner sc = new Scanner(Systemin);

            int code = scnextInt();

            if (code == 1) {

                Systemoutprintln("请输入编号");

                int no = scnextInt();

                Systemoutprintln("请输入书名");

                String name = scnext();

                Systemoutprintln("请输入售价");

                double value = scnextDouble();

                Book book = new Book(no, name, value);

                bladd(book);

                blwriteXmlDocument(book);

            } else if (code == 2) {

                Systemoutprintln("请输入要删除的书籍名");

                String name = scnext();

                if (bldelete(name)) {

                    Systemoutprintln("删除成功");

                } else {

                    Systemoutprintln("书籍不存在");

                }

            } else if (code == 3) {

                Systemoutprintln("请输入要修改的书籍名");

                String name = scnext();

                Book bookBefore = blquery(name);

                Systemoutprintln("请输入新的编号");

                int newNo = scnextInt();

                Systemoutprintln("请输入新的书名");

                String newName = scnext();

                Systemoutprintln("请输入新的售价");

                double value = scnextDouble();

                Book bookAfter = new Book(newNo, newName, value);

                blupdate(bookBefore, bookAfter);

            } else if (code == 4) {

                Systemoutprintln("请输入要查询的书籍名");

                String name = scnext();

                Book book = blquery(name);

                Systemoutprintln("编号:" + bookgetNo() + " 书名:" + bookgetName() + " 售价:" + bookgetValue());

            } else if (code == 5) {

                List<Book> list = blgetBookList();

                Systemoutprintln("总书籍数:" + blgetCount());

                for (Book book : list) {

                    Systemoutprintln("编号:" + bookgetNo() + " 书名:" + bookgetName() + " 售价:" + bookgetValue());

                }

            } else if (code == 6) {

                bBreak = false;

            }

        }

    }

}

jar 包  dom4jjar  jaxen-114jar

后期主要是用来做配置文件的

<xml version="10" encoding="utf-8">

<students>

<student id="1">

<name>@@</name>

<age>56</age>

</student>

<student id="2">

<name>@@</name>

<age>56</age>

</student>

</students>

XML文件的后缀名为:xml

文档声明必须是第一行第一列

<xml version="10" encoding="UTF-8" standalone="yes”>version:该属性是必须存在的encoding:该属性不是必须的

打开当前xml文件的时候应该是使用什么字符编码表(一般取值都是UTF-8)

standalone: 该属性不是必须的,描述XML文件是否依赖其他的xml文件,取值为yes/no

必须存在一个根标签,有且只能有一个

XML文件中可以定义注释信息

XML文件中可以存在以下特殊字符

常见的解析工具

JAXP: SUN公司提供的一套XML的解析的API

JDOM: 开源组织提供了一套XML的解析的API-jdom

DOM4J: 开源组织提供了一套XML的解析的API-dom4j,全称:Dom For Java

pull: 主要应用在Android手机端解析XML

dom解析分为四步:1、document 2、element 3、attribute 4、text

什么是约束

用来限定xml文件中可使用的标签以及属性

DTD语法

定义元素

定义一个元素的格式为:<!ELEMENT 元素名 元素类型>简单元素:

EMPTY: 表示标签体为空

ANY: 表示标签体可以为空也可以不为空

PCDATA: 表示该元素的内容部分为字符串

复杂元素: 直接写子元素名称 多个子元素可以使用","或者"|"隔开; ","表示定义子元素的顺序 ; "|": 表示子元素只能出现任意一个 ""零次或一次, "+"一次或多次, ""零次或多次;如果不写则表示出现一次

<!ELMENT students (student))>

<!ELMENT student (naem,age))>

<!ELMENT name (#PCDATA))>

<!ELMENT age (#PCDATA))>

dtd定义属性

格式

定义一个属性的格式为:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>属性的类型: CDATA类型:普通的字符串

属性的约束:

// #REQUIRED: 必须的 // #IMPLIED: 属性不是必需的 // #FIXED value:属性值是固定的

<!ATTLIST student id CDATA #EQUIRED>

schema语法,格式

1,创建一个文件,这个文件的后缀名为xsd。

2,定义文档声明

3,schema文件的根标签为: <schema>

4,在<schema>中定义属性: xmlns= >

 由此可以这样理解Node和Element,Node是节点,一个属性、一段文字、一个注释等都是节点,而Element是元素,是比较完整的一个xml的元素,即我们口头上说的xml“结点”(此处故意使用“结”字,以示与“节点”Node区别),呵呵……

dom4j帮助文档在dom4j-161/docs/guidehtml文件里面,全部是英文,但是基本上应该能看懂。

1、 四种 *** 作xml的方式:SAX,DOM,JDOM,DOM4J

2、 DOM(Document Object Model):意思是把整个xml做为一个整体对象,直接全部放到内存里面,不管xml文件有多大;

3、 SAX=Sample API for XML:假如xml文件有2G,用第一种方式,是很困难的,SAX用的是一种类似流媒体方式进行的。

DOM和SAX是java的API,处理xml文件的时候,相对来说是比较困难的,于是出现了下面两种框架,包装了上面两个框架。

4、 JDOM:

5、 DOM4J:

6、 利用DOM4J解析xml文件(读取所有的属性节点)。

Document可以理解为整个文档对象

取root节点。DocumentgetRootElement()返回的是一个Element(元素)

7、 理解运用xpath,path就是路径,xpath在xml文件里面找到特定的节点。

DocumentselectNodes(“//hibernate-mapping/class/property”) //其中hibenate-mapping是根节点。做变orgdom4jNode对象返回的。

DocumentselectSingleNodes(“//hibernate-mapping/class/property”)//只拿第一个。

基中@name是property的属性名valueOf是拿出name的值;

需要加入DOM4J里面的jaxen包

8、 DOM4J的生成xml文件

9、 用FileWriter生成xml文件的时候,可能没有格式,可以用XMLWriter类,这样自动进行美化。

10、 DOM4J修改xml文件;很少用。

11、 自动生成代码往往用的是:freemarker或velocity,这是常用的。用dom4j生成也很少用。

12、 怎么用表里面的结构生成xml文件。

13、 JavaDB

a) Properties对象:可以理解为一个表格对应key,value

14、 Databasemetadata,可以能过这个JDK类,读取数据库的表结构,通过这个表结构做一些自己的事情。(熟悉用法)通过JDK文档和google学习

15、 元数据就是数据的数据,用来描述数据的数据。

16、 DWR,对Ajax框架封住得比较好,是类和java的结合。

以上就是关于java如何从一个xml文件读取根节点、子节点属性。全部的内容,包括:java如何从一个xml文件读取根节点、子节点属性。、如何用java程序从xml文件中根据文本内容获取指定标签并删除标签和内容、【求助】Dom4j 生成xml,节点增加属性时,属性值中有特殊字符,如何做到不转义等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9731744.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存