验证XML文档

来源:互联网 发布:超级基因优化液txt全集下载 编辑:程序博客网 时间:2024/04/28 11:05

Element规则:指定某个元素拥有什么样的子元素。

<!ELEMENT menu (item)*>  //声明menu元素包含0个或多个item元素

<!ELEMENT font (name,size)>

<!ELEMENT name (#PCDATA)>

<!ELEMENT size (#PCDATA)>    /*声明font是用name和size描述,它们都包含文本*/


描述一本书章节的规则

<!ELEMENT chapter (intro,(heading,(para|image|table|note)+)+)

每一章都以简介开头,其后一个或多个小结,每个小结由一个标题和一个或多个段落、图片、表格、说明构成


描述合法元素属性的规则ATTLIST

<!ATTLIST element attribute type default>

属性类型

CDATA  任意字符串

NMTOKEN(S)  一个或多个名字标记

ID 一个唯一ID

IDREF(S) 一个或多个对唯一ID的引用

ENTITY(S) 一个或多个未解析的实体

属性的默认值

#REQUIRED  必需

#IMPLIED  可选

A  可选,若未指定,则为A

#FIXED A  属性必需是未指定的或者A


如何配置解析器利用DTD

1)通知文档工厂打开验证特性

factory.setValidating(true);

2)指定不解析空白文本

factory.setIgnoringElementContentWhitespace(true);

3)指定错误处理器

builder.setErrorHandler(handler);


解析带有Schema的XML文件

1)必需打开对命名空间的支持。factory.setNamespaceAware(true);

2)准备处理Schema的工厂

final String JAXP_SCHEMA_LANGUAGE="http://java.sun.com/xml/jaxpproperties/schemaLanguage";final String W3C_XML_SCHEMA = "http://www.w2.org/2001/XMLSchema";factory.setAttribute(JAXP_SCHEMA_LANGUAGE, W3C_XML_SCHEMA);

XPath定位信息

XPathFactory xpFactory = XPathFactory.newInstance();

path = xpFactory.newXPath();

String userName = path.evaluate("/configuration/database/username",doc);

注:/gridbag/row --> 描述了gridbag下面所有的row元素,可用[]来选择 、grid bag/row[1]

使用@操作符获取属性 --> 、gridbag/row[1]/cell[1]/@author

流机制解析器

1.SAX步骤

SAXParserFactory factory  = SAXParserFactory.newInstance();SAXParser parser = factory.newSAXParser();parser.parse(source, handler);

2.StAX步骤

XMLInputFactory factory = XMLInputFactory.newInstance();XMLStreamReader parser = factory.createXMLStreamReader(in);while(parser.hasNext()){int event = parser.next();//....}

两种类型爬虫代码比较

public static void main(String[] args) throws Exception {String url;if (args.length == 0) {url = "http://w3c.org";System.out.println("Using URL: " + url);} else {url = args[0];}DefaultHandler handler = new DefaultHandler() {public void startElement(String namespaceURI, String lname,String qname, Attributes attrs) {if (lname.equals("a") && attrs != null) {for (int i = 0; i < attrs.getLength(); i++) {String aname = attrs.getLocalName(i);if (aname.equals("href")) {System.out.println(attrs.getValue(i));}}}}};SAXParserFactory factory = SAXParserFactory.newInstance();factory.setNamespaceAware(true); // 激活命名空间factory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd",false); // 不加载DTD文件头SAXParser saxParser = factory.newSAXParser();InputStream in = new URL(url).openStream();saxParser.parse(in, handler);}

public static void main(String[] args) throws Exception {String url;if (args.length == 0) {url = "http://www.w3c.org";System.out.println(url);} else {url = args[0];}URL urlString = new URL(url);InputStream is = urlString.openStream();XMLInputFactory factory = XMLInputFactory.newInstance();XMLStreamReader parser = factory.createXMLStreamReader(is);while (parser.hasNext()) {int event = parser.next();if (event == XMLStreamConstants.START_ELEMENT) {if (parser.getLocalName().equals("a")) {String href = parser.getAttributeValue(null, "href");if (href != null) {System.out.println(href);}}}}}

生成XML文档

1. 不带命名空间

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.newDocument();Element root = doc.createElement("rootName");Element child = doc.createElement("childName");Text textNode = doc.createTextNode("123");doc.appendChild(root);root.appendChild(child);child.appendChild(textNode);

2.带命名空间

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();factory.setNamespaceAware(true);DocumentBuilder builder = factory.newDocumentBuilder();Document doc = builder.newDocument();String nameSpace = "http://www.w3.org/2000/svg";Element root = doc.createElementNS(nameSpace, "svg");Element svgElement = doc.createElementNS(nameSpace, "svg:svg");//上述代码转换为  <svg:svg xmlns:svg="http://www.w3.org/2000/svg">root.setAttributeNS(nameSpace, qualifiedName, value);

3.使用StAX

XMLOutputFactory factory = XMLOutputFactory.newInstance();XMLStreamWriter writer = factory.createXMLEventWriter(out);//生成文件头writer.writeStartDocument();//第一个元素writer.writeStartElement("name");//元素属性writer.writeAttribute("name", "value");//写出字符writer.writeCharacters("text");//元素结尾writer.writeEndElement();//文档结尾writer.writeEndDocument();



0 0