& => &
< => <
> => >
" => "s;
' => '
“”开头,以“?>”结尾,XML声明语句是最常见的一种处理指令。在使用 DOM 解析 XML 文档时,需要读取整个 XML 文档,在内存中构架代表整个 DOM 树的Doucment对象,从而再对XML文档进行操作。此种情况下,如果 XML 文档特别大,就会消耗计算机的大量内存,并且容易导致内存溢出。SAX解析允许在读取文档的时候,就对文档进行处理,而不必等到整个文档装载完才会文档进行操作。
SAX采用事件处理的方式解析XML文档,利用SAX解析XML文档,涉及解析器和事件处理器。
解析器可以使用JAXP的API创建,创建出SAX解析器后,就可以使用指定解析器去解析某个XML文档。解析器采用SAX方式解析文档时,只要解析到XML文档的一个组成部分,都会去调用事件处理器的一个方法,解析器在调用事件处理器方法时,会把当前解析到的xml文件内容作为方法的参数传递给事件处理器。
//使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
//通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
//通过解析器对象得到XML读取器
XMLReader xmlReader = sp.getXMLReader();
//设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
//解析xml文档
xmlReader.parse("book.xml");
实现ContentHandler接口,实现startElement、characters、endElement方法。
输出指定标签值。
class TagHander extends DefaultHandler{private String tagName;private int choice = 2; //要读取第几本书的版本号private int currenctVersion; //当前读取到第几本书@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {tagName = name;if (name.equals("version")) {currenctVersion++;}}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {if ("version".equals(tagName) && currenctVersion == choice) {System.out.println(new String(ch,start,length));}@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {tagName = null;}}
}
,元素类型可以是元素内容或类型。DTD规范定义了几种类型如EMPTY用于定义空元素,ANY表示元素内容为任意类型。
<书架><书><书名>一千零一夜书名><作者>佚名作者><售价>未知售价>书>
书架>
+、*、?等符号表示元素出现的次数,+表示一次或多次,?表示0次或一次,*表示0次或多次,(元素)必须出现一次。使用圆括号批量设置。
<商品 类别="服装" 颜色="黄色">商品>
XML Schema对名称空间的支持非常好,比DTD支持更多的数据类型。一个Schema文档称为模式文档,遵循这个文档书写的xml文件称为实例文档。
在XML Schema中,每个约束模式文档都可以被赋以一个唯一的名称空间,名称空间用一个唯一的URI(Uniform Resource Identifier,统一资源标识符)表示。 在Xml文件中书写标签时,可以通过名称空间声明(xmlns),来声明当前编写的标签来自哪个Schema约束文档。为了在一个XML文档中声明它所遵循的Schema文件的具体位置,通常需要在Xml文档中的根结点中使用schemaLocation属性来指定。
上一篇:DDD领域驱动设计初探
下一篇:每日学术速递3.8