扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:王洪伟 来源:CSDN 2007年9月28日
关键字:
在本页阅读全文(共2页)
文档对象模型解析
DOM 解析是基于对象的原理,当用DOM解析XML文档时它会在内存中生成一个树形的结构来表示一个XML文档。树上的每个节点代表着XML文档中的一个节点。如果一个DOM解析器符合W3C标准,那它产生的DOM就是W3C的DOM,使用org.w3c.dom APIs就能遍历和修改这个DOM。
大部分DOM解析器允许你抽取XML文档里的一部分来生成DOM树,而不是把整个XML文档在内存中建立对应DOM树。
使用JAXP, 通过DOM parse XML document的代码片断:
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
dbfactory.setNamespaceAware(true);
DocumentBuilder domparser = dbfactory.newDocumentBuilder();
//parse the XML and create the DOM
Document doc = domparser.parse(new File("data.xml"));
//to create a new DOM from scratch -
//Document doc = domparser.newDocument();
//once you have the Document handle, then you can use
//the org.w3c.dom.* APIs to traverse or modify the DOM...
在校验模式下进行解析
根据DTD校验
DTD 是XML 文档的语法。经常人们会觉得DTD有点另类,因为它和XML的syntax不一样,但DTD是W3C XML1.0里的完整的一部分。如果一份XML文档声明了DOCTYPE,并且想在解析的时候根据DTD校验文档,那你必须在适当的factory里启用根据DTD校验文档(validation)这个特性。例如:
DocumentBuilderFactory dbfactory = DocumentBuilderFactory.newInstance();
dbfactory.setValidating(true);
OR
SAXParserFactory spfactory = SAXParserFactory.newInstance();
spfactory.setValidating(true);
注意,如果XML文档声明了一个DTD ,即使你不启用校验(validation)这个特性,解析器总是试着去读入这个DTD。 这样做的目的是为了保证XML文档中entity reference被正确的扩展了,否则会导致格式不正确的XML文档,只有在XML文档序言部分的声明中standalone属性被置为true时,外部的DTD才会被完全忽略掉。例如:
<?xml version="1.1" encoding="UTF-8" standalone="yes"?>
根据W3C Schema来校验XML文档(WXS)
XMLSchema 是XML文档的另外一种文法描述。XMLSchema非常流行市因为它和XML文档使用同样的语法并且提供了丰富的定义校验限制的特性。如果一个XML文档用"schemaLocation" 和"noNamespaceSchemaLocation"指向了一个schema,结下来你想启用根据XMLSchema校验文档这个特性,你还要做如下的步骤:
1.和上面说的一样,调用SAXParserFactory o或DocumentBuilderFactory的setValidating函数来启用validation这个特性。
2.把属性 "http://java.sun.com/xml/jaxp/properties/schemaLanguage" 值设为 "http://www.w3.org/2001/XMLSchema"
注意,这种情况下,即使XML文档有DOCTYPE声明,处理器仍不会用DTD来校验这个文档。但是和前面提到的一样,为了任何一个entity reference是被正确扩展的,这个DTD还是会被装载的,
既然"schemaLocation" 和"noNamespaceSchemaLocation"仅仅是提示,所以可以使用属性"http://java.sun.com/xml/jaxp/properties/schemaSource"从外部提供schemas来覆盖这些提示。
对于这个属性,一些可以接受值是:
·是一个代表schema的URL地址的字符串。
·java.io.InputStream with the contents of the schema
·org.xml.sax.InputSource
·java.io.File
·一个 java.lang.Object 的数组,数组内容是上面所提到三类中的一个。
例如:
SAXParserFactory spfactory = SAXParserFactory.newInstance();
spfactory.setNamespaceAware(true);
//turn the validation on
spfactory.setValidating(true);
//set the validation to be against WXS
saxparser.setProperty("http://java.sun.com/xml/jaxp/properties/
schemaLanguage", "http://www.w3.org/2001/XMLSchema");
//set the schema against which the validation is to be done
saxparser.setProperty("http://java.sun.com/xml/jaxp/properties/
schemaSource", new File("myschema.xsd"));
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1593724
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者