XML的解析

1.      常用的XML解析方式:DOM和SAX

a)        DOM:Document ObjectModel,文档对象模型,非常适合增删改查(CRUD)

是W3C推荐的使用的解析方式

b)        SAX:Simple APIfor XML:只能进行查询操作,节省内存。非官方标准

2.      常用的解析开发包:JAXP,Dom4j,JDom

3.      无论是何种解析方式,首先是你先得到Document对象,然后得到Elment对象,一般Element对象是通过Document对象来获得的。SAX例外

4.      要严格区分XML文档树中的根结点与根元素结点:

a)  根结点(Document)代表的是XML文档本身,是我们解析XML文档的入口

b)  而根元素结点则表示XML文档的根元素,它对应于XML文档的Root。

 

JAXP解析

1.      JAXP(Java API forXML Parsing):SUN推出的实现,能实现DOM和SAX方式解析XML.。

2.      JAXP的API都在JavaSe中,

a)        org.w3c.dom:提供DOM方式解析XML的标准接口

b)        org.xml.sax:提供SAX方式解析XML的标准接口

c)        javax.xml:提供了解析XML文档的类

JAXP进行DOM解析

1.      对于XML应用开发来说,DOM就是一个对象化的XML数据接口,一个与语言无关,与平台无关的标准接口规范。

2.      一切皆节点即整个XML文档的每个XMl的结构都是节点,XML文档本身也是一个节点,节点包括XML文档,属性(Attr),元素(Element),CharacterData节点的子类文本(Text)节点和注释节点。DOM就是一个树形结构,如下图:

 

xml字符串解析成java对象_xml字符串解析成java对象



3.      XML文件读入的方式:

//获得DocumentBuilderFactory解析器工厂对象
DocumentBuilderFactory factory=newDocumentBuilderFactory();
//获得DocumentBuilder解析器对象
DocumentBuilder builder=factory.newDocumentBuilder();
//获得XML的整个文档对象
         Document document=builder.parse(@xml文档);

         注:@XMl文档可以是字符串,可以是File对象,URL对象,InputStream对象

4.      一个XML文档里可能有很多相同名字节点,通过Documen对象的getElementTagName()方法得到NodeList对象,再通过NodeList的item(index)选择你要操作第index个元素节点。item(index)方法返回的是节点对象,这个节点对象如果含有元素,就可以对元素进行增删改查操作。Document对象常见方法如下

5.      要想获得具体的节点,先得到Node对象,再强制转换为具体的节点对象。

比如我要操作Element节点,首先将Node强制转换为Element,再通过Element节点来操作元素里面的属性和设置文本内容。

例如:Element ele=(Element)node;

6.      元素对象(Element)可以对属性进行增删改查。

6.将XMl写入到xml文档:

 

//将设置完的内容保存到xml文件中
TransformerFactorytransfactory=TransformerFactory.newInstance();
                   Transformertrans=transfactory.newTransformer();
                   trans.transform(newDOMSource(doc),new StreamResult("temp\\test.xml"));

SAX解析

1.      SAX(Simple APIs for XML),面向XML的简单APIs ,SAX使用的观察者模式中的设计模式(类似于GUI中事件)。

2.      通过读取器读取XMl文档,当读到了文档的某一部分是(文档的开是,元素的开始,,文本,元素的结束,文档的结束),都会调用事件处理器的对应方法,读到的数据,以参数的形式传递给对应的方法。

3.      SAX的结构原理图如下:

xml字符串解析成java对象_xml字符串解析成java对象_02

4.      SAX的基本创建过程:

//获得SAX的解析工厂
                   SAXParserFactory factory=SAXParserFactory.newInstance();
                   //获得SAX解析器
                   SAXParser parser=factory.newSAXParser();
                   //得到XML的读取流
                   XMLReader reader=parser.getXMLReader();
         
                   reader.setContentHandler(new DefaultHandler(){
 
                            //文档每个元素的开始处
                            @Override
                            public void startElement(String uri, String localName,
                                               String qName, Attributes attributes)throws SAXException {
                                     
                                     System.out.println("元素开始处:"+qName);
                            }
                            //每个元素之间的内容
                            @Override
                            public void characters(char[] ch,int start,int length)
                                               throws SAXException {
                                     System.out.println("文本内容:"+new String(ch,start,length));
                            }
                            //文档每个元素的结束
                            @Override
                            public void endElement(String uri, String localName, String qName)
                                               throws SAXException {
                                     System.out.println(qName);
                            }
                   });
                   //要解析的xml文档
reader.parse("src//exam.xml");

 

5.      使用SAX解析的好处:使用DOM解析XML时,首先将XML文档加载到内存当中,然后可以通过随机的方式访问内存中的DOM树;SAX是基于事件而且是顺序执行的,一旦经过了某个元素,我们就没有办法再去访问它了,SAX不必事先将整个XML文档加载到内存当中,因此它占据内存要比DOM小,对于大型的XML文档来说,通常会使用SAX而不是DOM进行解析。

 

 

Dom4j解析

1.      它兼具了dom和sax的优点。查询速度快,增删改速度快。具有方法链编程风格(method chain style)

2.      XML文档的基本创建过程:

//获得Document对象
                  SAXReader reader=newSAXReader();
                    Documentdocument=reader.read("stu.xml");
           //通过Document对象获得根元素
           Element rootElement=document.getRootElement();

3.      通过元素对象(包括根元素)来获得它下面的子元素的操作:

a)        获得该元素下第一个子元素:element();

b)        返回该元素下面全部的子元素,该方法返回的是一个List集合,我们可以通过List容器的增删改查方法来对元素进行操作,也可以使用List的Iterator来遍历List容器中所有的Elment对象:elements();

c)        返回该元素下所有指定的子元素:elements(String name).

4.      通过元素对象来获得它属性的操作方法:

a)        添加指定的属性,并给属性指定对应的值:addAttrbute(String name,String value);

b)        元素所包含的属性的数量,返回的是int类型:attrbuteCount();

c)        返回指定的属性的属性值,返回的是String类型:attrbuteValue(String name);

d)        获得元素中所有的属性集合,返回的是List类型:attrbutes()

5.      通过元素来对元素的文本内容今昔操作:

a)        给元素添加文本内容:addText();

b)        获得元素的文本内容:getText();

c)        获得指定元素的文本内容:elementText(String tagname);

6.      创建一个XML文档,元素,属性,就需要使用DocumentHelp对象了:

a)        创建一个指定的根元素的XML文档对象,返回的是Document对象:createDocument(Element rootElement)

b)        创建一个给定的字符串的XML文本内容,将会返回新的Document对象:

Document parseText(String text)

c)        创建一个指定名称的新元素,返回的是Element对象:createElement();

d)        创建一个指定的元素,属性名,属性值的属性(Attrbute)对象:

createAttribute(Element owner, QName qname, String value);

7.      将XML文档或者Element元素对象变成字符串:

asXML()方法:通过Document对象或者Element对象的引用,调用该方法。该Document或者是Element将会以字符串的表现形式表现。

8.      如何将增删改后的XML文档重新保存呢?

OutputStream out=newFileOutputStream(path);
           OutputFormatformat=OutputFormat.createPrettyPrint();
           XMLWriterwriter=new XMLWriter(out, format);
           writer.write(doc);
              writer.close();

这里的OutputFormat对象注意一下两个静态方法:

a)        createCompactFormat():保存完后的XML文档,是没有格式的,没有空格和换行,该方法是默认的创建方式,一般用在网页传输数据时,节省数据内存。

b)        createPrettyPrint():保存完后的XML文档,具有格式美好的,有空格,有换行,但占用内存比较大,一般不用于网络之间的传输。

c)        setEncoding(String encoding):设置XML文档的编码格式

9.      Dom4j的XPath解析:是通过特殊的符号直接定位到我想要找的内容:

如:Node node = document.selectSingleNode(String xpath);

xpath就是定义的规则,找到后获得Node对象,可以强转成Element对象,再通过元素对象可以进行下一步的增删改查动作。

a)         selectSingleNode(String xpath)方法:通过Xpath规则,来获得元素节点对象。

b)        valueof(String xpath):通过Xpath规则,来获得相应类型的属性值

 

例如使用的过程如下:

        

SAXReaderreader=new SAXReader();
           Document document = reader.read(“demo.xml”);
//省去了根元素的获取,直接通过Xpath规则的属性规则获得指定的元素节点
                    Node node =document.selectSingleNode("//student[@examid=123']");
//将Node对象强制转换成Element对象
                    Element e = (Element)node;
                    //获得该Element对象的另一个属性值:
                    int value=valueOf(“@cardid”);
                    //获得该元素下的子元素
                    Elementchild=e.element(“name”);