﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-java-god-随笔分类-xml</title><link>http://www.blogjava.net/java-god/category/29689.html</link><description /><language>zh-cn</language><lastBuildDate>Thu, 08 May 2008 05:25:58 GMT</lastBuildDate><pubDate>Thu, 08 May 2008 05:25:58 GMT</pubDate><ttl>60</ttl><item><title>xslt 获取 xml 数据的格式</title><link>http://www.blogjava.net/java-god/archive/2008/05/07/198886.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Wed, 07 May 2008 02:41:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/05/07/198886.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/198886.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/05/07/198886.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/198886.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/198886.html</trackback:ping><description><![CDATA[xml文件的格式<br />
&lt;?xml version="1.0" encoding="UTF-8"?&gt;<br />
&lt;DataSets&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;Metadata&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemDef OID="I0001" Name="姓名" DataType="string" Length=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SignificantDigits="" SASFieldName="" SDSVarName="" Origin=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Comment="" DefaultValue="" Note="输入您的名字"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;RangeCheckRelationship="and"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;CodeListRef Name="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Question&gt;您的姓名?&lt;/Question&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Control qualityControl="" operationType="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ItemDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemDef OID="I0002" Name="说明信息" DataType="text" Length=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;SignificantDigits="" SASFieldName="" SDSVarName="" Origin=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Comment="" DefaultValue="7g" Note="" RangeCheckRelationship="and"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;CodeListRef Name="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Question&gt;您的详细说明&lt;/Question&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Control qualityControl="" operationType="" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ItemDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemGroupDef OID="G0001" Name="个人描述" Repeating="yes"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;IsReferenceData="0" SASDatasetName="" Domain="" Origin="" Purpose=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Comment=""<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Note="个人描述信息,包括:[r]&amp;amp;lt;br/&amp;amp;gt;[/r]1, 姓名[r]&amp;amp;lt;br/&amp;amp;gt;[/r]2, 详细描述信息"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef ItemOID="I0001" Name="姓名" OrderNumber="1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Mandatory="no" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef ItemOID="I0002" Name="说明信息" OrderNumber="2"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Mandatory="no" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/ItemGroupDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;FormDef OID="F0001" Name="预诊-1" Repeating="yes"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Note="预诊信息[r]&amp;amp;lt;br/&amp;amp;gt;[/r]请详细输入"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemGroupRef ItemGroupOID="G0001" Name="个人描述"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;OrderNumber="1" Mandatory="no" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/FormDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;StudyEventDef OID="E0001" Name="新建诊断-1" Repeating="yes"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Type="Scheduled" Category=""&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;FormRef FormOID="F0001" Name="预诊-1" OrderNumber="1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Mandatory="no" page="1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/StudyEventDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;VarDef OID="var_0" DataType="string" Lable="您的姓名?"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Remark="E0001.1//F0001.1//G0001#1.I0001" Domain="" Function=""&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef Varname="v0" ItemOID="I0001" Eventpath="E0001.1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Formpath="F0001.1" ItemGrouppath="G0001#1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/VarDef&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;VarDef OID="var_1" DataType="text" Lable="您的详细说明"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Remark="E0001.1//F0001.1//G0001#1.I0002" Domain="" Function=""&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;ItemRef Varname="v0" ItemOID="I0002" Eventpath="E0001.1"<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;Formpath="F0001.1" ItemGrouppath="G0001#1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/VarDef&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/Metadata&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0010"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0009"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0008"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0007"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0006"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0005"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0004"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="1" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="2" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0003"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="niahoa" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="gee " VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0002"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="12" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="3" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;DataSet Subject="0001"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Event Name="abc"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="qqq" VarRefOID="var_0" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;Data Value="gg" VarRefOID="var_1" /&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/Event&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/DataSet&gt;<br />
&lt;/DataSets&gt;<br />
xslt文件的格式<br />
&lt;xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&gt;<br />
&lt;xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes"/&gt;<br />
&lt;xsl:strip-space elements="*"/&gt;<br />
<br />
&lt;xsl:template match="/"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="columnitems" select="//VarDef"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="rowitems" select="//DataSet"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="listcolumns"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="items" select="$columnitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="listrows"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="citems" select="$columnitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="ritems" select="$rowitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="listcolumns"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="items"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;SubjectCode,&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$items"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:when test="position() != last() and last() &gt;= 2"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@OID"/&gt;,&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:when&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@OID"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#xa;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;,&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$items"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:when test="position() != last() and last() &gt;= 2"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@Label"/&gt;,&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:when&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="@Label"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#xa;&lt;/xsl:text&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="listrows"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="citems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="ritems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$ritems"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:value-of select="@Subject"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;,&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="item" select="Event"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="listrow"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="dataitem" select="$item"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="matchcitems" select="$citems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="listrow"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="dataitem"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="matchcitems"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$matchcitems"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="have"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:variable name="cellname" select="@OID"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:call-template name="printcell"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="cn" select="$cellname"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:with-param name="celldatas" select="$dataitem"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:call-template&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:variable&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &lt;xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:when test="position() != last() and last() &gt;= 2"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="$have"/&gt;,&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:when&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;xsl:value-of select="$have"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/xsl:otherwise&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:choose&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#xa;&lt;/xsl:text&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;xsl:template name="printcell"&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="cn"/&gt;<br />
&nbsp;&nbsp; &nbsp;&lt;xsl:param name="celldatas"/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:for-each select="$celldatas/Data"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:if test="$cn = @VarRefOID"&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:value-of select="@Value"/&gt;&lt;xsl:text/&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;xsl:text&gt;&#x22;&lt;/xsl:text&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:if&gt;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&lt;/xsl:for-each&gt;<br />
&lt;/xsl:template&gt;<br />
<br />
&lt;/xsl:stylesheet&gt;<br />
<br />
<img src ="http://www.blogjava.net/java-god/aggbug/198886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-05-07 10:41 <a href="http://www.blogjava.net/java-god/archive/2008/05/07/198886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>采用org.w3c.dom进行XML操作，包括查找、新增、删除、修改结点</title><link>http://www.blogjava.net/java-god/archive/2008/02/24/181766.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Sun, 24 Feb 2008 06:30:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/02/24/181766.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/181766.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/02/24/181766.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/181766.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/181766.html</trackback:ping><description><![CDATA[<span>
<p>/**<br />
* 类名XmlOperate&lt;p&gt;<br />
* 编写者 ：java_god&lt;p&gt;<br />
**/</p>
<p>public class XmlOperate<br />
{<br />
<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：getNodeList&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：获取父结点parent的所有子结点&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param parent<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@return &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：NodeList &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static NodeList getNodeList(Element parent)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return parent.getChildNodes();<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：getElementsByName&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：在父结点中查询指定名称的结点集&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param parent<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param name<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@return &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：Element[] &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static Element [] getElementsByName(Element parent,String name)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ArrayList resList=new ArrayList();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NodeList nl=getNodeList(parent);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for(int i=0;i&lt;nl.getLength();i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Node nd=nl.item(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(nd.getNodeName().equals(name))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  resList.add(nd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Element [] res=new Element [resList.size()];<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for(int i=0;i&lt;resList.size();i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  res[0]=(Element)resList.get(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug(parent.getNodeName()+"'s children of "+name+<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  "'s num:"+res.length);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return res;<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：getElementName&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：获取指定Element的名称&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param element<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@return &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：String &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static String getElementName(Element element)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return element.getNodeName();<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：getElementValue&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：获取指定Element的值&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param element<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@return &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：String &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static String getElementValue(Element element)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NodeList nl=element.getChildNodes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for(int i=0;i&lt;nl.getLength();i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(nl.item(i).getNodeType()==Node.TEXT_NODE)//是一个Text Node<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug(element.getNodeName()+" has a Text Node.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return element.getFirstChild().getNodeValue();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.error(element.getNodeName()+" hasn't a Text Node.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return null;<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：getElementAttr&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：获取指定Element的属性attr的值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param element<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param attr<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@return &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：String &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static String getElementAttr(Element element,String attr)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return element.getAttribute(attr);<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：setElementValue&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：设置指定Element的值&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param element<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param val &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：void &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static void setElementValue(Element element,String val)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Node node=element.getOwnerDocument().createTextNode(val);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NodeList nl=element.getChildNodes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for(int i=0;i&lt;nl.getLength();i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Node nd=nl.item(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(nd.getNodeType()==Node.TEXT_NODE)//是一个Text Node<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  nd.setNodeValue(val);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug("modify "+element.getNodeName()+"'s node value succe.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  return;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug("new "+element.getNodeName()+"'s node value succe.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  element.appendChild(node);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：setElementAttr&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：设置结点Element的属性&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param element<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param attr<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param attrVal &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：void &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static void setElementAttr(Element element,<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  String attr,String attrVal)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  element.setAttribute(attr,attrVal);<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：addElement&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：在parent下增加结点child&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param parent<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param child &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：void &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static void addElement(Element parent,Element child)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  parent.appendChild(child);<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：addElement&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：在parent下增加字符串tagName生成的结点&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param parent<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param tagName &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：void &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static void addElement(Element parent,String tagName)<br />
&nbsp;&nbsp;&nbsp;  {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Document doc=parent.getOwnerDocument();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Element child=doc.createElement(tagName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  parent.appendChild(child);<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：addElement&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：在parent下增加tagName的Text结点，且值为text&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param parent<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param tagName<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param text &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：void &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static void addElement(Element parent,String tagName,String text)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Document doc=parent.getOwnerDocument();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Element child=doc.createElement(tagName);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  setElementValue(child,text);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  parent.appendChild(child);<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /**<br />
&nbsp;&nbsp;&nbsp;  * 方法名称：removeElement&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 方法功能：将父结点parent下的名称为tagName的结点移除&lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param parent<br />
&nbsp;&nbsp;&nbsp;  * 参数说明：@param tagName &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 返回：void &lt;p&gt;<br />
&nbsp;&nbsp;&nbsp;  * 作者：luoc<br />
&nbsp;&nbsp;&nbsp;  * 日期：2005-6-22<br />
&nbsp;&nbsp;&nbsp;  **/<br />
&nbsp;&nbsp;&nbsp;  public static void removeElement(Element parent,String tagName)<br />
&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug("remove "+parent.getNodeName()+"'s children by tagName "+tagName+" begin...");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  NodeList nl=parent.getChildNodes();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  for(int i=0;i&lt;nl.getLength();i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  Node nd=nl.item(i);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if(nd.getNodeName().equals(tagName))<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  parent.removeChild(nd);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug("remove child '"+nd+"' success.");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  logger.debug("remove "+parent.getNodeName()+"'s children by tagName "+tagName+" end.");<br />
&nbsp;&nbsp;&nbsp;  }<br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  /*全局变量*/&nbsp;&nbsp;&nbsp;  <br />
&nbsp;&nbsp;&nbsp;  static Logger logger=Logger.getLogger("XmlOper");<br />
}</p>
</span>
<img src ="http://www.blogjava.net/java-god/aggbug/181766.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-02-24 14:30 <a href="http://www.blogjava.net/java-god/archive/2008/02/24/181766.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java SE 6中XML数字签名的实现</title><link>http://www.blogjava.net/java-god/archive/2008/02/24/181759.html</link><dc:creator>java flex 结合</dc:creator><author>java flex 结合</author><pubDate>Sun, 24 Feb 2008 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/java-god/archive/2008/02/24/181759.html</guid><wfw:comment>http://www.blogjava.net/java-god/comments/181759.html</wfw:comment><comments>http://www.blogjava.net/java-god/archive/2008/02/24/181759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/java-god/comments/commentRss/181759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/java-god/services/trackbacks/181759.html</trackback:ping><description><![CDATA[ackage test.xml.signature;<br />
<br />
import java.io.File;<br />
import java.io.FileInputStream;<br />
import java.io.FileOutputStream;<br />
import java.io.IOException;<br />
import java.io.ObjectOutputStream;<br />
import java.security.Key;<br />
import java.security.KeyFactory;<br />
import java.security.KeyPair;<br />
import java.security.KeyPairGenerator;<br />
import java.security.PrivateKey;<br />
import java.security.PublicKey;<br />
import java.security.spec.EncodedKeySpec;<br />
import java.security.spec.PKCS8EncodedKeySpec;<br />
import java.security.spec.X509EncodedKeySpec;<br />
import java.util.Collections;<br />
import java.util.List;<br />
<br />
import javax.xml.crypto.dom.DOMStructure;<br />
import javax.xml.crypto.dsig.CanonicalizationMethod;<br />
import javax.xml.crypto.dsig.DigestMethod;<br />
import javax.xml.crypto.dsig.Reference;<br />
import javax.xml.crypto.dsig.SignatureMethod;<br />
import javax.xml.crypto.dsig.SignedInfo;<br />
import javax.xml.crypto.dsig.Transform;<br />
import javax.xml.crypto.dsig.XMLSignature;<br />
import javax.xml.crypto.dsig.XMLSignatureFactory;<br />
import javax.xml.crypto.dsig.dom.DOMSignContext;<br />
import javax.xml.crypto.dsig.dom.DOMValidateContext;<br />
import javax.xml.crypto.dsig.keyinfo.KeyInfo;<br />
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;<br />
import javax.xml.crypto.dsig.keyinfo.KeyValue;<br />
import javax.xml.crypto.dsig.spec.C14NMethodParameterSpec;<br />
import javax.xml.crypto.dsig.spec.TransformParameterSpec;<br />
import javax.xml.parsers.DocumentBuilderFactory;<br />
import javax.xml.transform.Transformer;<br />
import javax.xml.transform.TransformerFactory;<br />
import javax.xml.transform.dom.DOMSource;<br />
import javax.xml.transform.stream.StreamResult;<br />
<br />
import org.w3c.dom.Document;<br />
import org.w3c.dom.Node;<br />
import org.w3c.dom.NodeList;<br />
<br />
public class SignatureXML {<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; public void saveKey(PublicKey publicKey, PrivateKey privateKey) throws Exception{<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; X509EncodedKeySpec ksp = new X509EncodedKeySpec(publicKey.getEncoded());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FileOutputStream fos = new FileOutputStream("C:\\public.key");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fos.write(ksp.getEncoded());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fos.close();<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PKCS8EncodedKeySpec pks = new PKCS8EncodedKeySpec(privateKey.getEncoded());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fos = new FileOutputStream("C:\\private.key");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fos.write(pks.getEncoded());<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fos.close();<br />
}<br />
&nbsp;&nbsp; <br />
public Key LoadKeyFromFile(boolean ispk, String keyFile) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Key key = null;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; FileInputStream is = null;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; is = new FileInputStream(keyFile);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; byte[] buf = new byte[is.available()];<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; KeyFactory keyFactory = KeyFactory.getInstance("DSA");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; is.read(buf);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; EncodedKeySpec keySpec;<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (ispk) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; keySpec = new PKCS8EncodedKeySpec(buf);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; keySpec = new X509EncodedKeySpec(buf);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; key = (!ispk ? (Key) keyFactory.generatePublic(keySpec) : (Key) keyFactory.generatePrivate(keySpec));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } finally {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; is.close();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (IOException iex) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; iex.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return key;<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; public void SignatureXMLDocument(String docPath) throws Exception {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dbf.setNamespaceAware(true);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(docPath));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.SignatureXMLDocument(doc);<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; public void SignatureXMLDocument(Document doc) throws Exception {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; XMLSignatureFactory fac = XMLSignatureFactory.getInstance();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*创建 &lt;Reference&gt; 元素，引用整个 XML 文档：<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *创建 Reference 的时候将 URI 参数指定为 "" 表示对整个 XML 文档进行引用；<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *摘要算法指定为 SHA1；这里将转换方式指定为 ENVELOPED ，<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; *这样在对整个文档进行引用并生成摘要值的时候，&lt;Signature&gt; 元素不会被计算在内。*/<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Transform envelopedTransform = fac.newTransform(Transform.ENVELOPED,(TransformParameterSpec) null);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DigestMethod sha1DigMethod = fac.newDigestMethod(DigestMethod.SHA1,&nbsp;&nbsp; null);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Reference refToRootDoc = fac.newReference("", sha1DigMethod,Collections.singletonList(envelopedTransform), null, null);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*创建 &lt;SignedInfo&gt; 元素<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *因为最终的数字签名是针对 &lt;SignedInfo&gt; 元素而生成的，所以需要指定该 XML 元素的规范化方法，<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 以确定最终被处理的数据。这里指定为 INCLUSIVE_WITH_COMMENTS , <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 表示在规范化 XML 内容的时候会将 XML 注释也包含在内。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * &nbsp;&nbsp; 至此，待签名的内容（&lt;SignedInfo&gt; 元素）已指定好，再只需要签名所使用的密钥就可以创建数字签名了。*/<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; CanonicalizationMethod c14nWithCommentMethod = <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; fac.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE_WITH_COMMENTS,(C14NMethodParameterSpec) null);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SignatureMethod dsa_sha1SigMethod = fac.newSignatureMethod(SignatureMethod.DSA_SHA1, null);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SignedInfo signedInfo = fac.newSignedInfo(c14nWithCommentMethod,dsa_sha1SigMethod,Collections.singletonList(refToRootDoc));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*XML 数字签名规范规定了多种在 &lt;KeyInfo&gt; 中指定验证密钥的方式，比如 &lt;KeyName&gt;，&lt;KeyValue&gt;，&lt;X509Data&gt;，&lt;PGPData&gt; 等等。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 这里使用 XML 数字签名规范规定必须实现的 &lt;DSAKeyValue&gt; 来指定验证签名所需的公共密钥。<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 在程序中使用 java.security 包生成 DSA 密钥对。*/<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //创建密钥对<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DSA");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; kpGen.initialize(512);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; KeyPair keyPair = kpGen.generateKeyPair();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PublicKey publicKey&nbsp;&nbsp; = keyPair.getPublic();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PrivateKey privateKey = keyPair.getPrivate();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.saveKey(publicKey, privateKey);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //以公钥为参数创建 &lt;KeyValue&gt; 元素<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; KeyInfoFactory keyInfoFac = fac.getKeyInfoFactory();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; KeyValue keyValue = keyInfoFac.newKeyValue(publicKey);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //根据创建好的 &lt;KeyValue&gt; 元素创建 &lt;KeyInfo&gt; 元素：<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; KeyInfo keyInfo = keyInfoFac.newKeyInfo(Collections.singletonList(keyValue));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*这里创建的密钥对，其中的公钥已经用于创建 &lt;KeyInfo&gt; 元素并存放在其中，供签名验证使用，而其中的私钥则会在下一步被用于生成签名。*/<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //创建 &lt;Signature&gt; 元素<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*前面已经创建好 &lt;SignedInfo&gt; 和 &lt;KeyInfo&gt; 元素，为了生成最终的数字签名，<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * 需要根据这两个元素先创建 &lt;Signature&gt; 元素，然后进行签名，<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * 创建出 &lt;SignatureValue&gt; 元素。*/<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; XMLSignature signature = fac.newXMLSignature(signedInfo, keyInfo);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*XMLSignature 类中的 sign 方法用于对文档进行签名，在调用 sign 方法之前，<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * 还需要创建 DOMSignContext 对象，为方法调用提供上下文信息，<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; * 包括签名所使用的私钥和最后生成的 &lt;Signature&gt; 元素所在的目标父元素：*/<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DOMSignContext dsc =&nbsp;&nbsp;&nbsp; new DOMSignContext(privateKey, doc.getDocumentElement());&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; //生成签名<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; /*sign 方法会生成签名值，并作为元素值创建 &lt;SignatureValue&gt; 元素，然后将整个 &lt;Signature&gt; 元素加入为待签名文档根元素的直接子元素。*/<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; signature.sign(dsc);&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; TransformerFactory tf = TransformerFactory.newInstance();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Transformer transformer = tf.newTransformer();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DOMSource source=new DOMSource(doc);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; transformer.transform(source, new StreamResult(System.out));&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; StreamResult result = new StreamResult(new File("C:\\old.xml"));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; transformer.transform(source,result);<br />
<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; private void validate(String signedFile) throws Exception {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Parse the signed XML document to unmarshal &lt;Signature&gt; object.<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dbf.setNamespaceAware(true);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(signedFile));<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; this.validate(doc);<br />
&nbsp;&nbsp; }<br />
<br />
&nbsp;&nbsp; private void validate(Document doc) throws Exception {<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Search the Signature element<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; NodeList nl = doc.getElementsByTagNameNS(XMLSignature.XMLNS,"Signature");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (nl.getLength() == 0) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; throw new Exception("Cannot find Signature element");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Node signatureNode = nl.item(0);<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; XMLSignature signature = fac.unmarshalXMLSignature(new DOMStructure(signatureNode));<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Get the public key for signature validation<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; KeyValue keyValue = (KeyValue) signature.getKeyInfo().getContent().get(0);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; PublicKey pubKey = keyValue.getPublicKey();<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Create ValidateContext<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; DOMValidateContext valCtx = new DOMValidateContext(pubKey,signatureNode);<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Validate the XMLSignature<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; boolean coreValidity = signature.validate(valCtx);<br />
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Check core validation status<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; if (coreValidity == false) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.err.println("Core validation failed");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // Check the signature validation status<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; boolean sv = signature.getSignatureValue().validate(valCtx);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Signature validation status: " + sv);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; // check the validation status of each Reference<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; List refs = signature.getSignedInfo().getReferences();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; for (int i = 0; i &lt; refs.size(); i++) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Reference ref = (Reference) refs.get(i);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; boolean refValid = ref.validate(valCtx);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Reference[" + i + "] validity status: "&nbsp;&nbsp; + refValid);<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } else {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.out.println("Signature passed core validation");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; <br />
&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; SignatureXML signatureXML=new SignatureXML();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; try {<br />
//&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; signatureXML.SignatureXMLDocument("C:\\new.xml");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; signatureXML.validate("C:\\old.xml");<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; } catch (Exception e) {<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; e.printStackTrace();<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }<br />
&nbsp;&nbsp; }<br />
<br />
}<br />
<br />
<br />
<img src ="http://www.blogjava.net/java-god/aggbug/181759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/java-god/" target="_blank">java flex 结合</a> 2008-02-24 14:05 <a href="http://www.blogjava.net/java-god/archive/2008/02/24/181759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>