一、XML文档定义的形式。
1、dtd(文档类型定义)。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE note[
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA) >
<!ELEMENT from (#PCDATA) >
<!ELEMENT heading (#PCDATA) >
<!ELEMENT body (#PCDATA) >
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
2、schema(XML模式)。
1)定义XMLSchema1.xsd文件。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/XMLSchema1"
xmlns="http://www.example.org/XMLSchema1"
elementFormDefault="qualified"><xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="to" type="xs:string"/>
<xs:element name="from" type="xs:string"/>
<xs:element name="heading" type="xs:string"/>
<xs:element name="body" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
2)定义xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<note
xmlns="http://www.example.org/XMLSchema1"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.example.org/XMLSchema1 XMLSchema1.xsd"> <to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
3、两种方式的区别。
XML Schema和DTD都用于文档验证,但二者还有一定的区别。
a)Schema本身是XML,可以被XML解析器解析;
b)XML Schema是内容开放模型,可扩展,功能性强;而DTD可扩展性差;
c)XML Schema支持丰富的数据类型,而DTD不支持元素的数据类型,对属性的类型定义也很有限;
d)XML Schema支持命名空间机制,而DTD不支持;
e)XML Schema可针对不同情况对整个XML文档或文档局部进行验证;而DTD缺乏这种灵活性;
f)XML Schema完全遵循XML规范,符合XML语法,可以和DOM结合使用,功能强大;而DTD语法本身有自身的语法和要求,难以学习。
二、解析XML文档的方式。
1、DOM(文档对象模型)。
1)简述。
在DOM方式中,程序一次性处理整个XML文档,并将它转化成DOM树。一个XML方式对应一棵DOM树,放置在内存中以供读写。DOM方式提供了对XML文档的随机访问,程序可以随时访问XML文档的任何一部分,为开发者带了不少方便,但是由于它需要将所有的数据都放到内存中,所以效率较SAX低。在JAXP中,包org.w3c.dom专门用于对DOM方式的支持。
2)实例。
import java.io.InputStream;
import java.util.Iterator;import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;public class ReadXml{
public static final String TEMPLATEDEFINE_FILENAME = "/com/ewider/dais/service/reportimport/example.xml"; public static final String TEMPLATEDEFINE_TAG = "Def";
public static void parseFile() {
try {
InputStream input = ReadXml.class.getResourceAsStream(TEMPLATEDEFINE_FILENAME);
SAXReader reader = new SAXReader();
Document doc;
doc = reader.read(input);
Element root = doc.getRootElement();
Iterator itr = root.elementIterator(TEMPLATEDEFINE_TAG);
while (itr.hasNext()) {
Element defEle = (Element) itr.next();
System.out.println(defEle.attributeValue("name"));
System.out.println(defEle.getStringValue());
}
} catch (DocumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}catch (Exception e) { e.printStackTrace();
}
}
public static void main(String []args){
ReadXml.parseFile();
}}
xml文件实例:
<?xml version="1.0" encoding="UTF-8"?>
<Defs> <Def name="Example">
This is a XML Example!
</Def>
</Defs>
SAX(Simple API for XML)。
1)简述。
在SAX方式中,程序顺序地访问XML文档。每次读到XML的一个元素就调用回调函数,开发者在回调函数,开发者在回调函数中定义对XML数据的处理。由于SAX方式每次只读XML文件的一部分放到内存中,所以SAX处理XML文档的效率比较高,但是操作也比较复杂。在JAXP中,包org.xml.sax专门用于对SAX方式的支持。
2)实例。
import java.io.File;
import java.util.Vector;import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;public class PraseXML extends DefaultHandler
{ private Vector<String> tagName;
private Vector<String> tagValue;
private int step;
// 开始解析XML文件
public void startDocument() throws SAXException
{
tagName = new Vector<String>();
tagValue = new Vector<String>();
step = 0;
} // 结束解析XML文件
public void endDocument() throws SAXException
{
for (int i = 0; i < tagName.size(); i++)
{
if (!tagName.get(i).equals("") || tagName.get(i) != null)
{
System.out.println("节点名称:" + tagName.get(i));
System.out.println("节点值:" + tagValue.get(i));
}
}
}
public void startElement(String uri, String localName, String qName,
Attributes attributes) throws SAXException
{
// 节点名称
tagName.add(qName);
// 循环输出属性
for (int i = 0; i < attributes.getLength(); i++)
{
// 获取属性名称
System.out.println("属性名称:" + attributes.getQName(i));
// 获取属性值
System.out.println("属性值:"
+ attributes.getValue(attributes.getQName(i)));
} }
public void endElement(String uri, String localName, String qName)
throws SAXException
{ step = step + 1;
}
public void characters(char ch[], int start, int length)
throws SAXException
{
// 只要当前的标签组的长度一至,值就不赋,则反标签不被计划在内
if (tagName.size() - 1 == tagValue.size())
{
tagValue.add(new String(ch, start, length));
}
} public static void main(String[] args)
{
String filename = "MyXml.xml";
SAXParserFactory spf = SAXParserFactory.newInstance();
try
{
SAXParser saxParser = spf.newSAXParser();
saxParser.parse(new File(filename), new PraseXML());
}
catch (Exception e)
{
e.printStackTrace();
}
} public Vector getTagName()
{
return tagName;
} public void setTagName(Vector tagName)
{
this.tagName = tagName;
} public Vector getTagValue()
{
return tagValue;
} public void setTagValue(Vector tagValue)
{
this.tagValue = tagValue;
}}
xml文件实例:
<?xml version="1.0" encoding="UTF-8"?>
<people> <person personid="e01" enable="true">
<name>张三</name>
<tel>5128</tel>
<email>txq512@sina.com</email>
</person>
<person personid="e02" enable="false">
<name>meixin</name>
<tel>5252525</tel>
<email>wnight88@sina.com</email>
</person>
<person personid="e03" enable="true">
<name>yu</name>
<tel>5389654</tel>
<email>yu@188.net</email>
</person>
</people>