使用Java解析名称空间的方法.doc

上传人:自*** 文档编号:126285038 上传时间:2020-03-24 格式:DOC 页数:18 大小:59KB
返回 下载 相关 举报
使用Java解析名称空间的方法.doc_第1页
第1页 / 共18页
使用Java解析名称空间的方法.doc_第2页
第2页 / 共18页
使用Java解析名称空间的方法.doc_第3页
第3页 / 共18页
使用Java解析名称空间的方法.doc_第4页
第4页 / 共18页
使用Java解析名称空间的方法.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《使用Java解析名称空间的方法.doc》由会员分享,可在线阅读,更多相关《使用Java解析名称空间的方法.doc(18页珍藏版)》请在金锄头文库上搜索。

1、 使用Java解析名称空间的方法 http:/ 2009-06-30 13:54 佚名 赛迪网 我要评论() 本文介绍了Java中向名称空间映射提供前缀的三种不同方式。本文亦包含了示例代码以方便您编写自己的 NamespaceContext。如果想要在 XPath 表达式中使用名称空间,必须提供对此名称空间 URI 所用前缀的链接。 前提条件和示例 本文所有的示例均使用如下这个XML文件: 清单1. 示例XML 这个 XML 示例包含三个在根元素内声明的名称空间,一个在此结构的更深层元素上声明的名称空间。您将可以看到这种设置所带来的差异。 这个 XML 示例的第二个有趣之处在于元素 bookl

2、ist 具有三个子元素,均名为 book。但是第一个子元素具有名称空间 science,而其他子元素则具有名称空间 fiction。这意味着这些元素完全有别于 XPath。在接下来的这些例子中,您将可以看到这种特性产生的结果。 示例源代码中有一个需要注意之处:此代码没有针对维护进行优化,只针对可读性进行了优化。这意味着它将具有某些冗余。输出通过 System.out.println() 以最为简单的方式生成。在本文中有关输出的代码行均缩写为 “.”。 理论背景 名称空间究竟有何意义?为何要如此关注它呢?名称空间是元素或属性的标识符的一部分。元素或属性可以具有相同的本地名称,但是必须使用不同的名

3、称空间。它们完全不同。请参考上述示例(science:book 和 fiction:book)。若要综合来自不同资源的 XML 文件,就需要使用名称空间来解决命名冲突。以一个 XSLT 文件为例。它包含 XSLT 名称空间的元素、来自您自己名称空间的元素以及(通常)XHTML 名称空间的元素。使用名称空间,就可以避免具有相同本地名称的元素所带来的不确定性。 名称空间由 URI(在本例中为 http:/univNaSpResolver/booklist)定义。为了避免使用这个长字符串,可以定义一个与此 URI 相关联的前缀(在本例中为 books)。请记住此前缀类似于一个变量:其名称并不重要。如

4、果两个前缀引用相同的 URI,那么被加上前缀的元素的名称空间将是相同的(请参见 清单 5 中的示例 1)。 XPath 表达式使用前缀(比如 books:booklist/science:book)并且您必须提供与每个前缀相关联的 URI。这时,就需要使用 NamespaceContext。它恰好能够实现此目的。 本文给出了提供前缀和 URI 之间的映射的不同方式。 在此 XML 文件中,映射由类似 xmlns:books=http:/univNaSpResolver/booklist 这样的 xmlns 属性或 xmlns=http:/univNaSpResolver/book(默认名称空间

5、)提供。 提供名称空间解析的必要性 如果 XML 使用了名称空间,若不提供 NamespaceContext,那么 XPath 表达式将会失效。清单 2 中的示例 0 充分展示了这一点。其中的 XPath 对象在所加载的 XML 文档之上构建和求值。首先,尝试不用任何名称空间前缀(result1)编写此表达式。之后,再用名称空间前缀(result2)编写此表达式。 清单 2. 无名称空间解析的示例 0 private static void example0(Document example) throws XPathExpressionException, TransformerExcept

6、ion sysout(n* Zero example - no namespaces provided *); XPath xPath = XPathFactory.newInstance().newXPath();. NodeList result1 = (NodeList) xPath.evaluate(booklist/book, example, XPathConstants.NODESET);. NodeList result2 = (NodeList) xPath.evaluate( books:booklist/science:book, example, XPathConsta

7、nts.NODESET);. 输出如下所示。 清单 3. 示例 0 的输出 * Zero example - no namespaces provided *First try asking without namespace prefix:- booklist/bookResult is of length 0Then try asking with namespace prefix:- books:booklist/science:bookResult is of length 0The expression does not work in both cases.在两种情况下,XPath

8、 求值并不返回任何节点,而且也没有任何异常。XPath 找不到节点,因为缺少前缀到 URI 的映射。 硬编码的名称空间解析 也可以以硬编码的值来提供名称空间,类似于 清单 4 中的类: 清单 4. 硬编码的名称空间解析 public class HardcodedNamespaceResolver implements NamespaceContext /* * This method returns the uri for all prefixes needed. Wherever possible * it uses XMLConstants. * * param prefix * ret

9、urn uri */ public String getNamespaceURI(String prefix) if (prefix = null) throw new IllegalArgumentException(No prefix provided!); else if (prefix.equals(XMLConstants.DEFAULT_NS_PREFIX) return http:/univNaSpResolver/book; else if (prefix.equals(books) return http:/univNaSpResolver/booklist; else if

10、 (prefix.equals(fiction) return http:/univNaSpResolver/fictionbook; else if (prefix.equals(technical) return http:/univNaSpResolver/sciencebook; else return XMLConstants.NULL_NS_URI; public String getPrefix(String namespaceURI) / Not needed in this context. return null; public Iterator getPrefixes(S

11、tring namespaceURI) / Not needed in this context. return null; 请注意名称空间 http:/univNaSpResolver/sciencebook 被绑定到了前缀 technical(不是之前的 science)。结果将可以在随后的 示例(清单 6)中看到。在 清单 5 中,使用此解析器的代码还使用了新的前缀。 清单 5. 具有硬编码名称空间解析的示例 1 private static void example1(Document example) throws XPathExpressionException, Transfor

12、merException sysout(n* First example - namespacelookup hardcoded *); XPath xPath = XPathFactory.newInstance().newXPath(); xPath.setNamespaceContext(new HardcodedNamespaceResolver();. NodeList result1 = (NodeList) xPath.evaluate( books:booklist/technical:book, example, XPathConstants.NODESET);. NodeL

13、ist result2 = (NodeList) xPath.evaluate( books:booklist/fiction:book, example, XPathConstants.NODESET);. String result = xPath.evaluate(books:booklist/technical:book/:author, example);. 如下是此示例的输出。 清单 6. 示例 1 的输出 * First example - namespacelookup hardcoded *Using any namespaces results in a NodeList:

14、- books:booklist/technical:bookNumber of Nodes: 1如您所见,XPath 现在找到了节点。好处是您可以如您所希望的那样重命名前缀,我对前缀 science 就是这么做的。XML 文件包含前缀 science,而 XPath 则使用了另一个前缀 technical。由于这些 URI 都是相同的,所以节点均可被 XPath 找到。不利之处是您必须要在多个地方(XML、XSD、 XPath 表达式和此名称空间的上下文)维护名称空间。 从文档读取名称空间 名称空间及其前缀均存档在此 XML 文件内,因此可以从那里使用它们。实现此目的的最为简单的方式是将这个查找指派给该文档。 清单 7. 从文档直

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > IT计算机/网络 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号