本站首页    管理页面    写新日志    退出


«August 2025»
12
3456789
10111213141516
17181920212223
24252627282930
31


公告

戒除浮躁,读好书,交益友


我的分类(专题)

日志更新

最新评论

留言板

链接

Blog信息
blog名称:邢红瑞的blog
日志总数:523
评论数量:1142
留言数量:0
访问次数:9692344
建立时间:2004年12月20日




[java语言]DOM3的使用 
原创空间,  软件技术,  电脑与网络

邢红瑞 发表于 2006/12/20 21:22:12

W3C 的文档对象模型 (DOM) 级别 1 和 DOM 级别 2(org.w3c.dom API 是 DOM 级别 2 API)规范中没有用于加载和保存 XML 文档的标准方法。DOM 3增加了两个新的特性,标准的创建和保存DOM, 主要用于输入和输出,包名为org.w3c.dom.ls,否则得使用Transformer。创建一个parser,加载一个Document,或者使用writer,输出一个Document。 DOMImplementationLS 可以创建一个同步parser,创建 Load 和 Save 对象的工厂方法。主要有以下2个方法parse(LSInput input):创建一个新的空输入源对象,其中,LSInput.characterStream、   LSInput.byteStream、LSInput.stringData LSInput.systemId、LSInput.publicId、 LSInput.baseURI 和 LSInput.encoding 为 null,LSInput.certifiedText 为 false。   返回:新创建的输入对象。 parseURI(String url):创建一个新的 LSParser。然后新构建的解析器可以通过其 DOMConfiguration 对象得以配置,并通过其 parse 方法用来解析文档。 参数:mode - mode 参数是 MODE_SYNCHRONOUS 或 MODE_ASYNCHRONOUS,如果 mode 是 MODE_SYNCHRONOUS,则所创建的 LSParser 将以同步模式操作,如果它是 MODE_ASYNCHRONOUS,则所创建的 LSParser 将以异步模式操作。schemaType - 绝对 URI,表示在使用新创建的 LSParser 加载 Document 期间所使用的模式语言的类型。注意,不对绝对 URI 执行词法检查。为任何种类的模式类型创建 LSParser(即 LSParser 将自由使用找到的模式),使用 null 值。 注:对于 W3C XML Schema [XML Schema Part 1],应用程序必须使用值 "http://www.w3.org/2001/XMLSchema"。对于 XML DTD [XML 1.0],应用程序必须使用值 "http://www.w3.org/TR/REC-xml"。其他的模式语言在 W3C 范围之外,因此为了使用此方法,应当推荐绝对 URI。 返回:新创建的 LSParser 对象。此 LSParser 或者是同步的或者是异步的,具体取决于 mode 参数的值。 注:默认情况下,新创建的 LSParser 不包含 DOMErrorHandler,即 "error-handler" 配置参数的值为 null。但是,创建时实现可以提供默认的错误处理程序。在这种情况下,在新的 LSParser 对象上的 "error-handler" 配置参数的初始值包含对默认错误处理程序的引用。 抛出: DOMException - NOT_SUPPORTED_ERR: 如果请求的模式类型不受支持,将引发此异常。DOMConfiguration 解析输入源时使用的 DOMConfiguration 对象。此 DOMConfiguration 特定于解析操作。在由解析操作创建或使用的 Document 上,没有参数值从此 DOMConfiguration 对象被自动传递到 DOMConfiguration 对象。DOM 应用程序负责将任何所需的参数值从此 DOMConfiguration 对象传递到由 Document 对象引用的 DOMConfiguration 对象。除在 "DOMConfiguration" 接口(在 [DOM Level 3 Core] 中定义)上识别的参数之外,针对 LSParser 的 DOMConfiguration 对象还可以添加或修改以下参数: "charset-overrides-xml-encoding" true [可选](默认)如果高层协议(如 HTTP)[IETF RFC 2616] 提供了对正被处理的输入流的字符编码的指示,则将重写在 XML 声明或 Text 声明中指定的任何编码(另请参见 [XML 1.0] 中的 4.3.3 节 "Character Encoding in Entities")。显式在 LSInput 中设置编码将重写协议中的任何编码。 false [必需] 解析器将忽略高层协议的任何字符集编码信息。 "disallow-doctype" true [可选] 如果在解析文档时出现了 doctype 节点,则将抛出严重的 "doctype-not-allowed" 错误。这在处理诸如 SOAP 信封之类的不允许有 doctype 节点的文档时非常有用。 false [必需](默认)允许文档中的 doctype 节点。 "ignore-unknown-character-denormalizations" true [必需](默认)如果在检验完全标准化时 [XML 1.1] 受支持,处理器遇到不能为其确定标准化属性的字符时,则处理器将忽略由这些字符导致的任何反向标准化。[XML 1.0]将忽略此参数。 false [可选] 如果遇到了处理器不能确定其标准化属性的字符,则报告严重的 "unknown-character-denormalization" 错误。 "infoset" 关于此参数的描述请参见 DOMConfiguration 的定义。与在 [DOM Level 3 Core] 中不同,对于 LSParser,此参数将默认为 true。 "namespaces" true [必需](默认)执行在 [XML Namespaces] 和 [XML Namespaces 1.1] 中定义的名称空间处理。 false [可选] 不执行名称空间处理。 "resource-resolver" [必需] 对 LSResourceResolver 对象的引用,或为 null。如果遇到外部资源(如外部 XML 实体或 XML 模式位置)时此参数的值不为 null,则实现将请求在此参数中引用的 LSResourceResolver 解析该资源。 "supported-media-types-only" true [可选] 检查被解析资源的媒体类型是否为被支持的媒体类型。如果遇到了不支持的媒体类型,则将引发类型 "unsupported-media-type" 的严重错误。必须总是接受在 [IETF RFC 3023] 中定义的媒体类型。 false [必需](默认)接受任何媒体类型。 "validate" 关于此参数的描述请参见 DOMConfiguration 的定义。与在 [DOM Level 3 Core] 中不同,总是要完成对内部子集的处理,即使此参数设置为 false。 "validate-if-schema" 关于此参数的描述请参见 DOMConfiguration 的定义。与在 [DOM Level 3 Core] 中不同,总是要完成对内部子集的处理,即使此参数设置为 false。 "well-formed" 关于此参数的描述请参见 DOMConfiguration 的定义。与在 [DOM Level 3 Core] 中不同,不能将此参数设置为 false。也可以使用过滤器过滤Element 输出文件LSSerializer 提供了将 DOM 文档序列化(编写)为 XML 的 API。XML 数据被写入字符串或输入流。在序列化期间所做的任何更改或修复仅影响序列化的数据。Document 对象及其子对象永远不会被序列化操作所改变。write(Document document, LSOutput output):将输出写入所提供的 LSOutput。当向 LSOutput 写入时,编码可以通过查找可通过 LSOutput 获得的编码信息和按如下顺序编写的条目(或者其所有者文档)来发现: LSOutput.encoding, Document.inputEncoding, Document.xmlEncoding. 如果没有编码可通过上述属性获得,则将使用 "UTF-8" 的默认编码。如果指定的编码不受支持,则将引发 "unsupported-encoding" 严重错误。如果在 LSOutput 中未指定输出,则将引发 "no-output-specified" 严重错误。实现负责将适当的媒体类型与已序列化的数据相关联。当向 HTTP URI 写入时,将执行 HTTP PUT。当向其他类型的 URI 写入时,向 URI 写入数据的机制具有实现依赖性。 参数:nodeArg - 将序列化的节点。destination - 已序列化 DOM 的目标。 返回:如果 node 被成功序列化,则返回 true。如果常规处理停止,但实现仍在序列化文档,则返回 false;序列化的结果是具有实现依赖性。 抛出: LSException - SERIALIZE_ERR:如果 LSSerializer 不能序列化节点,则引发此异常。如果 DOM 应用程序想获得有关错误的详细信息,则它必须附加上使用参数 "error-handler" 的 DOMErrorHandler。writeToString(Node node):输出写入到返回给调用者的 DOMString。所使用的编码是 DOMString 类型的编码,即 UTF-16。注意,在 DOMString 对象中未生成字节顺序标记。 参数:nodeArg - 将序列化的节点。 返回:返回序列化的数据。 抛出: DOMException - DOMSTRING_SIZE_ERR: 如果得到的字符串太长,不能放在 DOMString 中,则将引发此异常。 LSException - SERIALIZE_ERR: 如果 LSSerializer 不能序列化节点,则引发此异常。如果 DOM 应用程序想获得有关错误的详细信息,则它必须附加上使用参数 "error-handler" 的 DOMErrorHandler。writeToURI(String uri): 这是一种简便方法,其作用就像使用没有指定编码的 LSOutput 调用 LSSerializer.write,并且 LSOutput.systemId 被设置为 uri 参数。 参数:nodeArg - 要序列化的节点。uri - 要写入到的 URI。 返回:如果 node 被成功序列化,则返回 true。如果常规处理停止,但实现仍在序列化文档,则返回 false;序列化的结果是具有实现依赖性。 抛出: LSException - SERIALIZE_ERR:如果 LSSerializer 无法序列化节点,则引发此异常。如果 DOM 应用程序想获得有关错误的详细信息,则它必须附加上使用参数 "error-handler" 的 DOMErrorHandler。例如c:\\studentinfo.xml文件<?xml   version="1.0"   encoding="GBK"?>     <学生花名册>       <学生   性别   =   "女">       <姓名>李华</姓名>         <年龄>14</年龄>       <电话>6287555</电话>      </学生>       <学生   性别   =   "男">       <姓名>张三</姓名>       <年龄>16</年龄>       <电话>8273425</电话>      </学生>     </学生花名册>使用Filter显示女同学的记录,而且不显示年龄。Filter类package saxontest; import org.w3c.dom.ls.LSParserFilter;import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.traversal.NodeFilter; public class InputFilter implements LSParserFilter {     public short acceptNode(Node enode) {         return NodeFilter.FILTER_ACCEPT;    }     public int getWhatToShow() {        return NodeFilter.SHOW_ELEMENT;    }     public short startElement(Element elt) {        Element element = (Element) elt;        if (element.getTagName().equals("学生")) {            if (element.getAttribute("性别").equals("男")) {                return NodeFilter.FILTER_REJECT;            }        }        return LSParserFilter.FILTER_ACCEPT;    }}package saxontest; import org.w3c.dom.Element;import org.w3c.dom.Node;import org.w3c.dom.ls.LSSerializerFilter;import org.w3c.dom.traversal.NodeFilter; /** * * @author Administrator */public class OutputFilter implements LSSerializerFilter {     public short acceptNode(Node node) {        Element element = (Element) node;         if (element.getTagName().equals("年龄")) {                           return NodeFilter.FILTER_REJECT;                    }         return NodeFilter.FILTER_ACCEPT;    }     public int getWhatToShow() {        return NodeFilter.SHOW_ELEMENT;    }}主程序package saxontest; import org.w3c.dom.DOMConfiguration;import org.w3c.dom.Document;import org.w3c.dom.bootstrap.DOMImplementationRegistry;import org.w3c.dom.ls.DOMImplementationLS;import org.w3c.dom.ls.LSOutput;import org.w3c.dom.ls.LSParser;import org.w3c.dom.ls.LSParserFilter;import org.w3c.dom.ls.LSSerializer; /** * * @author Administrator */public class Level3Dom3 {     public static void main(String args[]) {         try {            DOMImplementationRegistry registry =                    DOMImplementationRegistry.newInstance();            DOMImplementationLS impl =                    (DOMImplementationLS) registry.getDOMImplementation("LS");            LSParser builder = impl.createLSParser(                    DOMImplementationLS.MODE_SYNCHRONOUS, null);             LSParserFilter filter = new InputFilter();            builder.setFilter(filter);            Document document = builder.parseURI("c:\\studentinfo.xml");            LSSerializer writer = impl.createLSSerializer();            //Set an output Filter            OutputFilter outputFilter = new OutputFilter();            writer.setFilter(outputFilter);            LSOutput output = impl.createLSOutput();            output.setByteStream(System.out);            output.setEncoding("GBK");            DOMConfiguration config = writer.getDomConfig();            config.setParameter("comments", Boolean.FALSE);            writer.write(document, output);        } catch (Exception e) {            System.out.println(e.toString());        }    }}结果<?xml version="1.0" encoding="GBK"?><学生花名册>       <学生 性别="女">       <姓名>李华</姓名>                <电话>6287555</电话>      </学生>     </学生花名册>


阅读全文(4091) | 回复(0) | 编辑 | 精华
 



发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.047 second(s), page refreshed 144756378 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号