`
yunzhu
  • 浏览: 1140759 次
  • 性别: Icon_minigender_1
  • 来自: 南京
博客专栏
B2b19957-cda7-3a9e-83a0-418743feb0ca
监控应用服务器
浏览量:109036
2e8be8be-e51f-346c-bcdd-12623c9aa820
Web前端开发
浏览量:119216
Bfa5df64-a623-34b9-85b8-ef3ce2aed758
经典异常的解决
浏览量:203943
社区版块
存档分类
最新评论

使用XPath解析XML的工具类

阅读更多

目录结构一览

一、首先看一下XPath的简单介绍


二、使用XPath的解析XML的工具类

 

三、通过一个测试类展示工具类的使用

     ---只是用于测试,此种写法不适用于实际项目中

 

四、上面的测试类所使用的XML文件

 

五、适用于项目中的写法(XML Node→Object)

      ---解析一个XML节点,直接转换为一个对象并返回给调用者

      1、解析XML返回对象的封装类

      2、上面类的单元测试类

      3、使用到的Bean类

 

 

首先看一下XPath的简单介绍

什么是XPath?

  • XPath使用路径表达式在XML文档中进行导航
  • XPath包含一个标准函数库
  • XPath是 XSLT 中的主要元素
  • XPath是一个 W3C 标准

XPath路径表达式
XPath使用路径表达式来选取XML文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

 

XPath标准函数
XPath含有超过100个内建的函数。这些函数用于字符串值、数值、日期和时间比较、节点和QName处理、序列处理、逻辑值等等。

 

在XPath中,有七种类型的节点:元素、属性、文本、命名空间、处理指令、注释以及文档节点(或称为根节点)。

 

XPath使用路径表达式来选取XML文档中的节点或节点集。节点是通过沿着路径(path)或者步(steps)来选取的。

 

 

使用XPath的解析XML的工具类

好吧,这还是09年底写的,会不会太老旧了?

 

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

/**
 * 解析XML的工具类,使用XPath
 * 
 * @author ChenFeng
 * @version [版本号, 2009-12-22]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class XMLParseUtil {
	private DocumentBuilder builder;

	private XPath xpath;

	/**
	 * 默认构造函数
	 * 
	 * @throws ParserConfigurationException
	 *             创建XML解析器出错!
	 */
	public XMLParseUtil() throws ParserConfigurationException {
		DocumentBuilderFactory domfactory = DocumentBuilderFactory
				.newInstance();
		builder = domfactory.newDocumentBuilder();

		XPathFactory xpfactory = XPathFactory.newInstance();
		xpath = xpfactory.newXPath();
	}

	/**
	 * 根据路径解析XML文档
	 * 
	 * <pre>
	 * 可能产生而没有显式抛出的异常:
	 * 1) MalformedURLException :传入文件路径错误!找不到要解析的文件!
	 * 2) SAXParseException : 文件格式错误!无法解析!
	 * </pre>
	 * 
	 * @param path
	 *            文件路径
	 * @return Document对象
	 * @throws IOException
	 *             IO异常
	 * @throws SAXException
	 *             SAX异常
	 * @see [类、类#方法、类#成员]
	 */
	public Document parseDocument(String path) throws IOException, SAXException {
		return builder.parse(path);
	}

	/**
	 * 根据文件解析XML文档
	 * 
	 * <pre>
	 * 可能产生而没有显式抛出的异常:
	 * 1) IllegalArgumentException :传入参数错误!如对象不能为空!
	 * 2) SAXParseException : 文件格式错误!无法解析!
	 * </pre>
	 * 
	 * @param file
	 *            文件
	 * @return Document对象
	 * @throws IOException
	 *             IO异常
	 * @throws SAXException
	 *             SAX异常
	 * @see [类、类#方法、类#成员]
	 */
	public Document parseDocument(File file) throws IOException, SAXException {
		return builder.parse(file);
	}

	/**
	 * 根据输入流解析XML文档
	 * 
	 * <pre>
	 * 可能产生而没有显式抛出的异常:
	 * 1) IllegalArgumentException :传入参数错误!如对象不能为空!
	 * 2) SAXParseException : 文件格式错误!无法解析!
	 * </pre>
	 * 
	 * @param is
	 *            输入流
	 * @return Document对象
	 * @throws IOException
	 *             IO异常
	 * @throws SAXException
	 *             SAX异常
	 * @see [类、类#方法、类#成员]
	 */
	public Document parseDocument(InputStream is) throws IOException,
			SAXException {
		return builder.parse(is);
	}

	/**
	 * 通过xpath取得节点列表
	 * 
	 * @param node
	 *            节点
	 * @param expression
	 *            XPath表达式
	 * @return NodeList
	 * @throws XPathExpressionException
	 *             XPath表达式异常
	 * @see [类、类#方法、类#成员]
	 */
	public NodeList selectNodes(Node node, String expression)
			throws XPathExpressionException {
		// XPath对象编译XPath表达式
		XPathExpression xpexpreesion = this.xpath.compile(expression);
		Object object = xpexpreesion.evaluate(node, XPathConstants.NODESET);
		return (NodeList) object;
	}

	/**
	 * 通过xpath取得单个节点
	 * 
	 * @param node
	 *            节点
	 * @param expression
	 *            XPath表达式
	 * @return Node
	 * @throws XPathExpressionException
	 *             XPath表达式异常
	 * @see [类、类#方法、类#成员]
	 */
	public Node selectSingleNode(Node node, String expression)
			throws XPathExpressionException {
		XPathExpression xpexpreesion = this.xpath.compile(expression);
		Object object = xpexpreesion.evaluate(node, XPathConstants.NODE);
		return (Node) object;
	}

	/**
	 * 根据xpath取得节点的文本值
	 * 
	 * @param node
	 *            节点
	 * @param expression
	 *            XPath表达式
	 * @return String
	 * @throws XPathExpressionException
	 *             XPath表达式异常
	 * @see [类、类#方法、类#成员]
	 */
	public String getNodeStringValue(Node node, String expression)
			throws XPathExpressionException {
		XPathExpression xpexpreesion = this.xpath.compile(expression);
		Object object = xpexpreesion.evaluate(node, XPathConstants.STRING);
		return (String) object;
	}
}

 

通过一个测试类展示工具类的使用

只是用于测试,此种写法不适用于实际项目中

import java.io.IOException;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * 入口程序
 * 
 * @author ChenFeng
 * @version [版本号, 2009-12-21]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class XMLParseUtilTest {

	/**
	 * 入口函数
	 * 
	 * @param args
	 * @see [类、类#方法、类#成员]
	 */
	public static void main(String[] args) {
		String path = XMLParseUtilTest.class.getResource("bookstore.xml")
				.getPath();

		XMLParseUtil xmlParse = null;
		try {
			xmlParse = new XMLParseUtil();
		} catch (ParserConfigurationException e) {
			System.out.println("异常:创建XML解析器过程中有一个严重的配置错误!");
			e.printStackTrace();
		}
		if (null != xmlParse) {
			Document doc = null;
			try {
				doc = xmlParse.parseDocument(path);
			} catch (MalformedURLException e) {
				System.out.println("异常:传入文件路径错误!找不到要解析的文件!");
				e.printStackTrace();
			} catch (SAXParseException e) {
				System.out.println("异常:文件格式错误!无法解析!");
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} catch (SAXException e) {
				e.printStackTrace();
			}

			if (null != doc) {
				NodeList bookNodeList = null;
				try {
					/**
					 * [title/@lang='en']表示选取的book节点,必须满足子节点title的lang属性为en
					 */
					bookNodeList = (NodeList) xmlParse.selectNodes(doc,
							"//bookstore/book[title/@lang='en']");
				} catch (XPathExpressionException e) {
					System.out.println("异常:XPath表达式错误!");
					e.printStackTrace();
				}

				if (null != bookNodeList) {
					List<Book> bookList = new ArrayList<Book>();

					for (int i = 0; i < bookNodeList.getLength(); i++) {
						Node node = bookNodeList.item(i);
						Book book = parseBookNode(xmlParse, node);
						bookList.add(book);
					}

					for (Book book : bookList) {
						System.out.println(book.toString());
					}
				}
			}
		}
	}

	/**
	 * 解析单个book节点
	 * 
	 * @param util
	 * @param node
	 * @return
	 * @throws XPathExpressionException
	 * @see [类、类#方法、类#成员]
	 */
	public static Book parseBookNode(XMLParseUtil util, Node node) {
		String lang = "";
		String title = "";
		String author = "";
		String year = "";
		String price = "";

		try {
			title = util.getNodeStringValue(node, "./title");
		} catch (XPathExpressionException e) {
			System.out.println("异常:XPath表达式错误!");
			e.printStackTrace();
		}
		try {
			lang = util.getNodeStringValue(node, "./title/@lang");
		} catch (XPathExpressionException e) {
			System.out.println("异常:XPath表达式错误!");
			e.printStackTrace();
		}
		try {
			author = util.getNodeStringValue(node, "./author");
		} catch (XPathExpressionException e) {
			System.out.println("异常:XPath表达式错误!");
			e.printStackTrace();
		}
		try {
			year = util.getNodeStringValue(node, "./year");
		} catch (XPathExpressionException e) {
			System.out.println("异常:XPath表达式错误!");
			e.printStackTrace();
		}
		try {
			price = util.getNodeStringValue(node, "./price");
		} catch (XPathExpressionException e) {
			System.out.println("异常:XPath表达式错误!");
			e.printStackTrace();
		}

		Book book = new Book(lang, title, author, year, price);
		return book;
	}

}

 

 

上面的测试类所使用的XML文件

文件名      :  bookstore.xml

文件路径  :  与上面的两个类放到同一目录下

<?xml version="1.0" encoding="gbk"?>
<bookstore>
	<book>
		<title lang="en">Harry Potter</title>
		<author>J K. Rowling</author>
		<year>2005</year>
		<price>28.5</price>
	</book>
	<book>
		<title lang="en">Junit IN Action</title>
		<author>Robert J.</author>
		<year>2007</year>
		<price>58.5</price>
	</book>
	<book>
		<title lang="en">Struts 2 IN Action</title>
		<author>Rhodes K.R</author>
		<year>2005</year>
		<price>53.6</price>
	</book>
	<book>
		<title lang="en">Thinking of Java 4th</title>
		<author>Bruce Eckel</author>
		<year>2007</year>
		<price>78.9</price>
	</book>
	<book>
		<title lang="zh">修炼架构师之道</title>
		<author>陈杰驰</author>
		<year>2009</year>
		<price>63.5</price>
	</book>
	<book>
		<title lang="zh">哲学:心灵,宇宙</title>
		<author>ChenFeng</author>
		<year>2010</year>
		<price>96</price>
	</book>
</bookstore>

 

适用于项目中的写法(XML Node→Object)

解析一个XML节点,直接转换为一个对象并返回给调用者

 

解析XML返回对象的封装类

...

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.xpath.XPathExpressionException;

import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

import cn.chenfeng.common.ServiceException;

public class XMLParseManager {
	private XMLParseUtil xmlParser;

	public XMLParseManager() {
		try {
			xmlParser = new XMLParseUtil();
		} catch (ParserConfigurationException e) {
			throw new ServiceException("XMLParseManager@XMLParseManager(): "
					+ "Failed to create XML parser!" + e);
		}
	}

	/**
	 * 初始化方法,通过文件对象初始化XML解析器和文档对象
	 * 
	 * @param xmlParser
	 * @param document
	 * @param file
	 * @see [类、类#方法、类#成员]
	 */
	private Document getDocument(File file) {
		Document document = null;
		try {
			document = xmlParser.parseDocument(file);
		} catch (IllegalArgumentException e) {
			throw new ServiceException("XMLParseManager@getDocument: "
					+ "An illegal or inappropriate argument!" + e);
		} catch (SAXParseException e) {
			throw new ServiceException("XMLParseManager@getDocument: "
					+ "XML file error, can not parse!" + e);
		} catch (SAXException e) {
			throw new ServiceException("XMLParseManager@getDocument: "
					+ "There is a SAXException!" + e);
		} catch (IOException e) {
			throw new ServiceException("XMLParseManager@getDocument: "
					+ "There is an IOException!" + e);
		}

		return document;
	}

	/**
	 * 获取节点的值
	 * 
	 * @return nodeValue
	 * @see [类、类#方法、类#成员]
	 */
	private String getNodeValue(Node node, String xpath) {
		String nodeValue = null;
		try {
			nodeValue = xmlParser.getNodeStringValue(node, xpath);
		} catch (XPathExpressionException e) {
			throw new ServiceException("XMLParseManager@getNodeValue: "
					+ "XPath expression [" + xpath + "] error!" + e);
		}
		return nodeValue;
	}

	/**
	 * 根据作者姓名获取书籍
	 * 
	 * @param file
	 *            XML文件对象
	 * @param name
	 *            书籍作者姓名
	 * @return myBook
	 * @see [类、类#方法、类#成员]
	 */
	public Book getBookByAuthor(File file, String name) {
		Book myBook = null;

		if (null != file) {
			Document doc = getDocument(file);
			if (null != doc) {
				/*
				 * [author='" + name + "'] 表示只取author为name参数值的book节点
				 */
				String title = getNodeValue(doc, "//book[author='" + name
						+ "']/title");
				String lang = getNodeValue(doc, "//book[author='" + name
						+ "']/title/@lang");
				String author = getNodeValue(doc, "//book[author='" + name
						+ "']/author");
				String year = getNodeValue(doc, "//book[author='" + name
						+ "']/year");
				String price = getNodeValue(doc, "//book[author='" + name
						+ "']/price");
				myBook = new Book(lang, title, author, year, price);
			}
		} else {
			throw new ServiceException("XMLParseManager@getBookByAuthor: "
					+ "File is null!");
		}

		return myBook;
	}

}
 

 

上面类的单元测试类

...

import java.io.File;

import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

public class XMLParseManagerTest {
	XMLParseManager xmlMgr;

	@Before
	public void setUp() throws Exception {
		xmlMgr = new XMLParseManager();
	}

	@After
	public void tearDown() throws Exception {
	}

	@Test
	public void testGetMyBook() {
		String path = XMLParseManager.class.getResource("bookstore.xml")
				.getPath();
		File xmlfile = new File(path);
		Book actualBook = xmlMgr.getBookByAuthor(xmlfile, "ChenFeng");
		Assert.assertNotNull(actualBook);

		Book expectedBook = new Book("zh", "哲学:心灵,宇宙", "ChenFeng", 2010, 96.0);
		Assert.assertEquals(expectedBook, actualBook);
	}
}

 

使用到的Bean类

...

package cn.chenfeng.XML.xpath;

/**
 * Book类
 * 
 * @author ChenFeng
 * @version [版本号, 2009-12-21]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public class Book {
	private String lang;

	private String title;

	private String author;

	private int year;

	private double price;

	public Book() {
	}

	public Book(String lang, String title, String author, String year,
			String price) {
		this.lang = lang;
		this.title = title;
		this.author = author;
		this.year = (int) Integer.valueOf(year);
		this.price = (double) Double.valueOf(price);
	}

	public Book(String lang, String title, String author, int year, double price) {
		this.lang = lang;
		this.title = title;
		this.author = author;
		this.year = year;
		this.price = price;
	}

	public String getLang() {
		return lang;
	}

	public void setLang(String lang) {
		this.lang = lang;
	}

	public String getTitle() {
		return title;
	}

	public void setTitle(String title) {
		this.title = title;
	}

	public String getAuthor() {
		return author;
	}

	public void setAuthor(String author) {
		this.author = author;
	}

	public int getYear() {
		return year;
	}

	public void setYear(String year) {
		this.year = (int) Integer.valueOf(year);
	}

	public void setYear(int year) {
		this.year = year;
	}

	public double getPrice() {
		return price;
	}

	public void setPrice(String price) {
		this.price = (double) Double.valueOf(price);
	}

	public void setPrice(double price) {
		this.price = price;
	}

	public boolean equals(Object object) {
		Book b = (Book) object;
		if (this.lang.equals(b.getLang()) && this.title.equals(b.getTitle())
				&& this.author.equals(b.getAuthor())
				&& this.year == b.getYear() && this.price == b.price) {
			return true;
		}
		return false;
	}

	public String toString() {
		StringBuffer buf = new StringBuffer("");
		buf.append("Book{\n").append("  lang=").append(lang)
				.append("\n  title=").append(title).append("\n  author=")
				.append(author).append("\n  year=").append(year)
				.append("\n  price=").append(price).append("\n}");
		return buf.toString();
	}
}

 

 

 完!

 

 

9
1
分享到:
评论

相关推荐

    jdom1.1.3xml解析工具类

    JDOM是由以下几个包组成的: org.jdom包含了所有的xml文档要素的java类 org.jdom.adapters包含了与dom适配的java类 org.jdom.filter包含了xml文档的过滤器类 org.jdom....org.jdom.xpath包含了对xml文档xpath操作的类

    javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码)

    javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) javascript封装的通用解析和操作xml文件数据工具类(含测试使用代码) 测试数据: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;root&gt; &lt;book&gt; ...

    XpathDemo.zip

    JsoupXPath是基于Jsoup的拓展,使用路径的形式解析XML和HTML文档。核心类为JXDocument;JsoupXPath的节点对象JXNode不仅可以获取标签节点,还可以获取属性节点 HtmlCleaner是一个开源的Java语言的Html文档解析器。...

    dom4j 和xpath

    dom4j 和dom4j 是一款比较好用的Xml解析工具jar,其中部分功能需要xpath的支持

    jsoup-1.11.2.jar工具类包.rar

    jsoup-1.11.2.jar JsoupXpath-0.3.2.jar jsoup-1.11.2-sources.jar jsoup-1.11.2-javadoc.jar 解析读取xml或html文档的工具类

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    XML轻松学习手册--XML肯定是未来的发展趋势,不论是网页设计师还是网络程序员,都应该及时学习和了解

    另一种是"确认类paeser",它不但检测文档语法,结构树,而且比较解析你使用的元素标识是否遵守了相应DTD文件的规范。 Parser能独立使用,也可以成为编辑软件或浏览器的一部分。在后面的相关资源列表里,我列出了...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part5

    3.3.6 使用sax解析xml文档实例 74 3.4 jdom 83 3.4.1 下载并配置jdom 83 3.4.2 jdom api介绍 84 3.5 dom4j 88 3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 ...

    JAVA_API1.6文档(中文)

    javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的...

    xml简单实现学生管理系统!看不懂来打我!!!

    再用dom4j解析器来对xml文件进行操作,也会用到一点xpath的东西。 二:实现步骤 1.Dom4j工具类 用来简化对xml的操作: import java.io.FileOutputStream; import java.io.IOException; import org.dom4j.Document; ...

    六星级 Java 高级架构

    7年大牛带你写框架-手写SpringlOC容器 JAVA高级进阶-实现ORM思想封装DBUtil工具类 大牛教你如何用mybatis的自动生成器...用dom4j+xpath这种完美的方式来解析xml 怎么用—张图来搞定面试官所提到的springmvc .../...等等

    MVC模式开发包

    JSP标准标签的时候,需要在web项目中使用jstl-1.2、...-----jaxen-1.1-beta-6.jar用于解析XPath表达式-------dom4j-1.6.1.jardom4j用于操作XML文件----commons-logging.jar,commons-beanutils-1.8.0.jar的依赖jar包

    apache-commons源码及jar文件

    Commons-Lang 提供了许多许多通用的工具类集,提供了一些java.lang中类的扩展功能 Latka Commons-Latka 是一个HTTP 功能测试包,用于自动化的QA,验收和衰减测试. Launcher Launcher 组件是一个交叉平台的Java 应用...

    分类:分类是从HTMLXML数据源提取结构化字段序列的有效工具。 它找到重复的模式并返回字段或XPath的序列以提取这些字段

    分类是从HTML / XML数据源提取结构化字段序列的有效工具。 它找到重复的模式,并返回字段或XPath的序列以提取这些字段。 什么时候有用 分类允许为特定数据源创建抓取/解析模式,并快速进行。 请参阅下面的用法部分。...

    java api最新7.0

    javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的类...

    Python使用Beautiful Soup爬取豆瓣音乐排行榜过程解析

    Beautiful Soup是一款高效的Python网页解析分析工具,可以用于解析HTL和XML文件并从中提取数据。 Beautiful Soup输入文件的默认编码是Unicode,输出文件的编码是UTF-8。 Beautiful Soup具有将输入文件自动补全的...

    [Java参考文档].JDK_API 1.6

    javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的类...

    Java 1.6 API 中文 New

    javax.xml.bind.util 有用的客户端实用工具类。 javax.xml.crypto 用于 XML 加密的通用类。 javax.xml.crypto.dom javax.xml.crypto 包的特定于 DOM 的类。 javax.xml.crypto.dsig 用于生成和验证 XML 数字签名的类...

Global site tag (gtag.js) - Google Analytics