使用 Java 验证 Lotus Forms XML 数字签名
2010-01-15 00:00:00 来源:WEB开发网由于父节点的名称空间前缀可以被一个子节点覆盖,比如默认名称空间,因此如果名称空间已被复制到目标,那么就不会再次复制该名称空间。这种方法遵守名称空间覆盖规则,因此只有距离最近的名称空间定义是有效的。
清单 3. 将名称空间从源节点的所有祖先复制到目标节点的代码private void cloneNamespaces(Element src, Element target) {
HashMap copiedNamespaces = new HashMap();
Node node = src;
while (node != null && node.getNodeType() == Node.ELEMENT_NODE) {
NamedNodeMap attributes = node.getAttributes();
for (int i = 0; i < attributes.getLength(); i++) {
Attr attr = (Attr) attributes.item(i);
String namespaceUri = attr.getNamespaceURI();
if (!XML_NS_URI.equals(namespaceUri)) {
// a normal attribute, don't copy it
continue;
}
String nodeValue = attr.getNodeValue();
String localName = attr.getLocalName();
String prefix = attr.getPrefix();
String qualifiedName = (prefix == null) ? localName : prefix
+ ":" + localName; //$NON-NLS-1$
// don't overwrite namespace already copied.
if (copiedNamespaces.containsKey(qualifiedName)) {
continue;
}
Document factory = target.getOwnerDocument();
Attr newAttr = factory.createAttributeNS(namespaceUri,
qualifiedName);
newAttr.setNodeValue(nodeValue);
target.setAttributeNodeNS(newAttr);
copiedNamespaces.put(qualifiedName, nodeValue);
}
node = node.getParentNode();
}
}
更多精彩
赞助商链接