« | August 2025 | » | 日 | 一 | 二 | 三 | 四 | 五 | 六 | | | | | | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 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</电话> </学生> </学生花名册> |
|
|