xmlutils.java
来自「JAVA 所有包」· Java 代码 · 共 694 行 · 第 1/2 页
JAVA
694 行
/* * Copyright 1999-2004 The Apache Software Foundation. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */package com.sun.org.apache.xml.internal.security.utils;import java.io.IOException;import java.io.OutputStream;import java.util.HashSet;import java.util.Iterator;import java.util.Set;import com.sun.org.apache.xml.internal.security.c14n.CanonicalizationException;import com.sun.org.apache.xml.internal.security.c14n.Canonicalizer;import com.sun.org.apache.xml.internal.security.c14n.InvalidCanonicalizerException;import org.w3c.dom.Attr;import org.w3c.dom.Document;import org.w3c.dom.Element;import org.w3c.dom.NamedNodeMap;import org.w3c.dom.Node;import org.w3c.dom.NodeList;import org.w3c.dom.Text;/** * DOM and XML accessibility and comfort functions. * * @author Christian Geuer-Pollmann */public class XMLUtils { /** * Constructor XMLUtils * */ private XMLUtils() { // we don't allow instantiation } /** * @param rootNode * @param result * @param exclude * @param com wheather comments or not */ public static void getSet(Node rootNode,Set result,Node exclude ,boolean com) { if ((exclude!=null) && isDescendantOrSelf(exclude,rootNode)){ return; } getSetRec(rootNode,result,exclude,com); } static final void getSetRec(final Node rootNode,final Set result, final Node exclude ,final boolean com) { //Set result = new HashSet(); if (rootNode==exclude) { return; } switch (rootNode.getNodeType()) { case Node.ELEMENT_NODE: result.add(rootNode); Element el=(Element)rootNode; if (el.hasAttributes()) { NamedNodeMap nl = ((Element)rootNode).getAttributes(); for (int i=0;i<nl.getLength();i++) { result.add(nl.item(i)); } } //no return keep working case Node.DOCUMENT_NODE: for (Node r=rootNode.getFirstChild();r!=null;r=r.getNextSibling()){ if (r.getNodeType()==Node.TEXT_NODE) { result.add(r); while ((r!=null) && (r.getNodeType()==Node.TEXT_NODE)) { r=r.getNextSibling(); } if (r==null) return; } getSetRec(r,result,exclude,com); } return; case Node.COMMENT_NODE: if (com) { result.add(rootNode); } return; case Node.DOCUMENT_TYPE_NODE: return; default: result.add(rootNode); } return; } /** * Outputs a DOM tree to an {@link OutputStream}. * * @param contextNode root node of the DOM tree * @param os the {@link OutputStream} */ public static void outputDOM(Node contextNode, OutputStream os) { XMLUtils.outputDOM(contextNode, os, false); } /** * Outputs a DOM tree to an {@link OutputStream}. <I>If an Exception is * thrown during execution, it's StackTrace is output to System.out, but the * Exception is not re-thrown.</I> * * @param contextNode root node of the DOM tree * @param os the {@link OutputStream} * @param addPreamble */ public static void outputDOM(Node contextNode, OutputStream os, boolean addPreamble) { try { if (addPreamble) { os.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".getBytes()); } os.write( Canonicalizer.getInstance( Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS).canonicalizeSubtree( contextNode)); } catch (IOException ex) {} catch (InvalidCanonicalizerException ex) { ex.printStackTrace(); } catch (CanonicalizationException ex) { ex.printStackTrace(); } } /** * Serializes the <CODE>contextNode</CODE> into the OutputStream, <I>but * supresses all Exceptions</I>. * <BR /> * NOTE: <I>This should only be used for debugging purposes, * NOT in a production environment; this method ignores all exceptions, * so you won't notice if something goes wrong. If you're asking what is to * be used in a production environment, simply use the code inside the * <code>try{}</code> statement, but handle the Exceptions appropriately.</I> * * @param contextNode * @param os */ public static void outputDOMc14nWithComments(Node contextNode, OutputStream os) { try { os.write( Canonicalizer.getInstance( Canonicalizer.ALGO_ID_C14N_WITH_COMMENTS).canonicalizeSubtree( contextNode)); } catch (IOException ex) { // throw new RuntimeException(ex.getMessage()); } catch (InvalidCanonicalizerException ex) { // throw new RuntimeException(ex.getMessage()); } catch (CanonicalizationException ex) { // throw new RuntimeException(ex.getMessage()); } } /** * Method getFullTextChildrenFromElement * * @param element * @return the string of chi;ds */ public static String getFullTextChildrenFromElement(Element element) { StringBuffer sb = new StringBuffer(); NodeList children = element.getChildNodes(); int iMax = children.getLength(); for (int i = 0; i < iMax; i++) { Node curr = children.item(i); if (curr.getNodeType() == Node.TEXT_NODE) { sb.append(((Text) curr).getData()); } } return sb.toString(); } /** * Creates an Element in the XML Signature specification namespace. * * @param doc the factory Document * @param elementName the local name of the Element * @return the Element */ public static Element createElementInSignatureSpace(Document doc, String elementName) { if (doc == null) { throw new RuntimeException("Document is null"); } String ds = Constants.getSignatureSpecNSprefix(); if ((ds == null) || (ds.length() == 0)) { Element element = doc.createElementNS(Constants.SignatureSpecNS, elementName); element.setAttributeNS(Constants.NamespaceSpecNS, "xmlns", Constants.SignatureSpecNS); return element; } Element element = doc.createElementNS(Constants.SignatureSpecNS, ds + ":" + elementName); element.setAttributeNS(Constants.NamespaceSpecNS, "xmlns:" + ds, Constants.SignatureSpecNS); return element; } /** * Returns true if the element is in XML Signature namespace and the local * name equals the supplied one. * * @param element * @param localName * @return true if the element is in XML Signature namespace and the local name equals the supplied one */ public static boolean elementIsInSignatureSpace(Element element, String localName) { if ((element == null) || !Constants.SignatureSpecNS.equals(element.getNamespaceURI()) ){ return false; } if (!element.getLocalName().equals(localName)) { return false; } return true; } /** * Returns true if the element is in XML Encryption namespace and the local * name equals the supplied one. * * @param element * @param localName * @return true if the element is in XML Encryption namespace and the local name equals the supplied one */ public static boolean elementIsInEncryptionSpace(Element element, String localName) { if ((element == null) || !EncryptionConstants.EncryptionSpecNS.equals(element.getNamespaceURI()) ){ return false; } if (!element.getLocalName().equals(localName)) { return false; } return true; } /** * This method returns the owner document of a particular node. * This method is necessary because it <I>always</I> returns a * {@link Document}. {@link Node#getOwnerDocument} returns <CODE>null</CODE> * if the {@link Node} is a {@link Document}. * * @param node * @return the owner document of the node */ public static Document getOwnerDocument(Node node) { if (node.getNodeType() == Node.DOCUMENT_NODE) { return (Document) node; } try { return node.getOwnerDocument(); } catch (NullPointerException npe) { throw new NullPointerException(I18n.translate("endorsed.jdk1.4.0") + " Original message was \"" + npe.getMessage() + "\""); } } /** * This method returns the first non-null owner document of the Node's in this Set. * This method is necessary because it <I>always</I> returns a * {@link Document}. {@link Node#getOwnerDocument} returns <CODE>null</CODE> * if the {@link Node} is a {@link Document}. * * @param xpathNodeSet * @return the owner document */ public static Document getOwnerDocument(Set xpathNodeSet) { NullPointerException npe = null; Iterator iterator = xpathNodeSet.iterator(); while(iterator.hasNext()) { Node node = (Node) iterator.next(); int nodeType =node.getNodeType(); if (nodeType == Node.DOCUMENT_NODE) { return (Document) node; } try { if (nodeType==Node.ATTRIBUTE_NODE) { return ((Attr)node).getOwnerElement().getOwnerDocument(); } return node.getOwnerDocument(); } catch (NullPointerException e) { npe = e; } } throw new NullPointerException(I18n.translate("endorsed.jdk1.4.0") + " Original message was \""
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?