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 + -
显示快捷键?