跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

Java 语言编程中更新 XML 文档的常用方法

黄理,北京大学四年级学生,对Java、XML技术深感兴趣,有长期编程经验。您可以通过 quantumfancy@hotmail.com与他联系。

简介: 本文简要的讨论了 Java 语言编程中更新 XML 文档的四种常用方法 , 并且分析这四种方法的优劣。其次 , 本文还对如何控制 Java 程序输出的 XML 文档的格式做了展开论述。

发布日期: 2002 年 3 月 04 日
级别: 初级
访问情况 : 1410 次浏览
评论: 


JAXP 是 Java API for XML Processing 的英文字头缩写 , 中文含义是 : 用于 XML 文档处理的使用 Java 语言编写的编程接口。JAXP 支持 DOM、SAX、XSLT 等标准。为了增强 JAXP 使用上的灵活性 , 开发者特别为 JAXP 设计了一个 Pluggability Layer, 在 Pluggability Layer 的支持之下 ,JAXP 既可以和具体实现 DOM API、SAX API 的各种 XML 解析器 (XML Parser, 例如 Apache Xerces) 联合工作 , 又可以和具体执行 XSLT 标准的 XSLT 处理器 (XSLT Processor, 例如 Apache Xalan) 联合工作。应用 Pluggability Layer 的好处在于 : 我们只需要熟悉 JAXP 各个编程接口的定义即可 , 而不需要对所采用的具体的 XML 解析器、XSLT 处理器有很深入的了解。比如在某个 Java 程序中 , 通过 JAXP 调用 XML 解析器 Apache Crimson 对 XML 文档进行处理 , 如果我们希望使用别的 XML 解析器 ( 比如 Apache Xerces), 以便提高该程序的性能 , 那么原程序代码可能不需要任何改变 , 直接就可以使用 ( 你所需要做的事情只是将包含 Apache Xerces 代码的 jar 文件加入到环境变量 CLASSPATH 中 , 而将包含 Apache Crimson 代码的 jar 文件在环境变量 CLASSPATH 中删除 )。

目前 JAXP 已经应用的十分普遍了 , 可以说是 Java 语言中处理 XML 文档的标准 API。有些初学者在学习使用 JAXP 的过程中 , 经常会提出这样的问题 : 我编写的程序对 DOM Tree 做了更新 , 但是当程序退出以后 , 原始的 XML 文档并没有改变 , 还是老样子 , 如何实现对原始 XML 文档和 DOM Tree 的同步更新呢 ? 咋一看来 , 在 JAXP 中似乎没有提供相应的接口 / 方法 / 类 , 这是很多初学者都感到困惑的问题。本文的主旨就在于解决这个问题 , 简单的介绍几种常用的同步更新原始 XML 文档和 DOM Tree 的方法。为了缩小讨论的范围 , 本文所涉及的 XML 解析器仅包括 Apache Crimson 和 Apache Xerces, 而 XSLT 处理器仅仅使用 Apache Xalan。

方法一 : 直接读写 XML 文档

这也许是最笨最原始的办法了。当程序获取 DOM Tree 之后 , 应用 DOM 模型的 Node 接口的各个方法对 DOM Tree 进行更新 , 下一步应该对原始的 XML 文档进行更新了。我们可以运用递归的办法或者是应用 TreeWalker 类 , 遍历整个 DOM Tree, 与此同时 , 将 DOM Tree 的每一个节点 / 元素依次写入到预先打开的原始 XML 文档中 , 当 DOM Tree 被遍历完全之后 ,DOM Tree 和原始的 XML 文档就实现了同步更新。实际中 , 这个方法极少使用 , 不过如果你要编程实现自己的 XML 解析器 , 这种方法还是有可能用得上的。


方法二 : 使用 XmlDocument 类

使用 XmlDocument 类 ?JAXP 中分明没有这个类呀 ! 是不是作者搞错了 ? 没有错 ! 就是使用 XmlDocument 类 , 确切的说 , 是使用 XmlDocument 类的 write() 方法。

在上文已经提到过 ,JAXP 可以和各种各样的 XML 解析器联合使用 , 这次我们选用的 XML 解析器是 Apache Crimson。XmlDocument(org.apache.crimson.tree.XmlDocument) 是 Apache Crimson 的一个类 , 并不包含于标准的 JAXP 中 , 难怪在 JAXP 的文档中找不到 XmlDocument 类的芳踪呢。现在问题出来了 , 如何应用 XmlDocument 类来实现更新 XML 文档的功能 ? 在 XmlDocument 类中提供了下面三个 write() 方法 ( 根据 Crimson 最新的版本 ------Apache Crimson 1.1.3):

public void write (OutputStream out) throws IOException
public void write (Writer out) throws IOException
public void write (Writer out, String encoding) throws IOException

上述三个 write() 方法的主要作用就是输出 DOM Tree 中的内容到特定的输出介质中 , 比如文件输出流、应用程序控制台等等。那么又如何使用上述三个 write() 方法呢 ? 请看下面的 Java 程序代码片断 :

 String name="fancy"; 
 DocumentBuilder parser; 
 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
 try 
 { 
 parser = factory.newDocumentBuilder(); 
	 Document doc = parser.parse("user.xml"); 
	 Element newlink=doc.createElement(name); 
	 doc.getDocumentElement().appendChild(newlink); 
	 ((XmlDocument)doc).write(new FileOutputStream(new File("xuser1.xml"))); 
 } 
 catch (Exception e) 
 { 
	 //to log it 
 } 

在上面的代码中 , 首先创建了一个 Document 对象 doc, 获取完整的 DOM Tree, 然后应用 Node 接口的 appendChild() 方法 , 在 DOM Tree 的最后追加了一个新节点 (fancy), 最后调用 XmlDocument 类的 write(OutputStream out) 方法 , 把 DOM Tree 中的内容输出到 xuser.xml 中 ( 其实也可以输出到 user.xml, 更新原始的 XML 文档 , 在这里为了便于做对比 , 故而输出到 xuser.xml 文件中 )。需要注意的是不能直接对 Document 对象 doc 直接调用 write() 方法 , 因为 JAXP 的 Document 接口并没有定义任何 write() 方法 , 所以必须将 doc 由 Document 对象强制转换为 XmlDocument 对象 , 然后才能调用 write() 方法 , 在上面的代码中使用的是 write(OutputStream out) 方法 , 这个方法使用缺省的 UTF-8 编码输出 DOM Tree 中的内容到特定的输出介质中 , 如果 DOM Tree 中包含中文字符 , 那么输出的结果有可能是乱码 , 亦即存在所谓的"汉字问题", 解决的办法是使用 write (Writer out, String encoding) 方法 , 显式指定输出时的编码 , 例如将第二个参数设为"GB2312", 这时即不存在"汉字问题", 输出结果能够正常显示中文字符。

完整的例子请参考下列文件 : AddRecord.java( 见附件 )、 user.xml( 见附件 )。该例子的运行环境为 :Windows XP Professional、JDK 1.3.1。为了能够正常编译运行 AddRecord.java这个程序 , 你需要到网址 http://xml.apache.org/dist/crimson/去下载 Apache Crimson, 并将所获取的 crimson.jar 文件加入到环境变量 CLASSPATH 中。

注意 :

Apache Crimson 的前身是 Sun Project X Parser, 后来不知何故 , 由 X Parser 演变为 Apache Crimson, 至今 Apache Crimson 的很多代码都是从 X Parser 中直接移植过来的。比如上文用到的 XmlDocument 类 , 它在 X Parser 中是 com.sun.xml.XmlDocument, 到了 Apache Crimson 中摇身一变 , 就变成了 org.apache.crimson.tree.XmlDocument 类 , 其实它们的绝大部分代码是一样的 , 可能就 package 语句和 import 语句以及文件开头的一段 lience 有所不同而已。早期的 JAXP 是和 X Parser 捆绑在一起的 , 因此一些老的程序使用了 com.sun.xml 包 , 如果你现在重新编译它们 , 有可能不能通过 , 肯定就是因为这个原因。后来的 JAXP 和 Apache Crimson 捆绑在一起 , 比如 JAXP 1.1, 如果你使用 JAXP 1.1, 那么不需要额外下载 Apache Crimson, 也能够正常编译运行上面的例子 ( AddRecord.java)。最新的 JAXP 1.2 EA(Early Access) 改弦更张 , 采用性能更好的 Apache Xalan 和 Apache Xerces 分别作为 XSLT 处理器和 XML 解析器 , 不能直接支持 Apache Crimson 了 , 所以如果你的开发环境采用了 JAXP 1.2 EA 或者是 Java XML Pack( 内含 JAXP 1.2 EA), 那么将无法直接编译运行上面的例子 ( AddRecord.java), 你需要额外下载并安装 Apache Crimson。


方法三 : 使用 TransformerFactory 和 Transformer 类

在 JAXP 中所提供的标准的更新原始 XML 文档的方法就是调用 XSLT 引擎 , 亦即使用 TransformerFactory 和 Transformer 类。请看下面的 Java 代码片断 :

// 首先创建一个 DOMSource 对象 , 该构造函数的参数可以是一个 Document 对象
//doc 代表更改后的 DOM Tree。
DOMSource doms = new DOMSource (doc); 
    
// 创建一个 File 对象 , 代表 DOM Tree 所包含的数据的输出介质 , 这是一个 XML 文件。
File f = new File ("XMLOutput.xml"); 
// 创建一个 StreamResult 对象 , 该构造函数的参数可以取为 File 对象。
StreamResult sr = new StreamResult (f); 
// 下面调用 JAXP 中的 XSLT 引擎来实现输出 DOM Tree 中的数据到 XML 文件中的功能。
//XSLT 引擎的输入为 DOMSource 对象 , 输出为 StreamResut 对象。
try 
{ 
 // 首先创建一个 TransformerFactory 对象 , 再由此创建 Transformer 对象。Transformer 
 // 类相当于一个 XSLT 引擎。通常我们使用它来处理 XSL 文件 , 但是在这里我们使
 // 用它来输出 XML 文档。
    TransformerFactory tf=TransformerFactory.newInstance();     
    Transformer t=tf.newTransformer (); 
 // 关键的一步 ,     调用 Transformer 对象 (XSLT 引擎 ) 的 transform() 方法 , 
 // 该方法的第一
 // 个参数是 DOMSource 对象 , 第二个参数是 StreamResult 对象。
    t.transform(doms,sr);     
} 
catch (TransformerConfigurationException tce) 
{             
    System.out.println("Transformer Configuration Exception\n-----");
    tce.printStackTrace();         
} 
catch (TransformerException te) 
{             
    System.out.println ("Transformer Exception\n---------");
    te.printStackTrace ();         
}     		
	

在实际的应用中 , 我们可以应用传统的 DOM API 从 XML 文档中获取 DOM Tree, 然后根据实际的需求对 DOM Tree 执行各种操作 , 得到最终的 Document 对象 , 接下来可以由此 Document 对象创建 DOMSource 对象 , 剩下的事情就是照搬上面的代码了 , 程序运行完毕后 , XMLOutput.xml 就是你所需要的结果 ( 当然了 , 你可以随意更改 StreamResult 类构造函数的参数 , 指定不同的输出介质 , 而不必是千篇一律的 XML 文档 )。

这个方法最大的好处在于可以随心所欲的控制 DOM Tree 中的内容输出到输出介质中的格式 , 但是光靠 TransformerFactory 类和 Transformer 类并不能实现这个功能 , 还需要依赖 OutputKeys 类的帮助。 完整的例子请参考下列文件 : AddRecord2.java( 见附件 )、 user.xml( 见附件 )。该例子的运行环境为 :Windows XP Professional、JDK 1.3.1。为了能够正常编译运行 AddRecord2.java 这个程序 , 你需要到网址 http://java.sun.com去下载安装 JAXP 1.1 或者 Java XML Pack(Java XML Pack 已经内含 JAXP 了 )。

OutputKeys 类

javax.xml.transform.OutputKeys 类和 java.util.Properties 类配合使用 , 可以控制 JAXP 的 XSLT 引擎 (Transformer 类 ) 输出 XML 文档的格式。请看下面的代码片断 :

	 // 首先创建一个 TransformerFactory 对象 , 再由此创建 Transformer 对象。
 TransformerFactory tf=TransformerFactory.newInstance(); 	
	 Transformer t=tf.newTransformer (); 
	
	 // 获取 Transformser 对象的输出属性 , 亦即 XSLT 引擎的缺省输出属性 , 这是一个
 //java.util.Properties 对象。
	 Properties properties = t.getOutputProperties();   
	 // 设置新的输出属性 : 输出字符编码为 GB2312, 这样可以支持中文字符 ,XSLT 引擎所输出
	 // 的 XML 文档如果包含了中文字符 , 可以正常显示 , 不会出现所谓的"汉字问题"。
	 // 请留意 OutputKeys 类的字符串常数 OutputKeys.ENCODING。
	 properties.setProperty(OutputKeys.ENCODING,"GB2312"); 
	 / 更新 XSLT 引擎的输出属性。
	 t.setOutputProperties(properties);   
	 // 调用 XSLT 引擎 , 按照输出属性中的设置 , 输出 DOM Tree 中的内容到输出介质中。
	 t.transform(DOMSource_Object,StreamResult_Object); 	
	

从上面的程序代码 , 我们不难看出 , 通过设置 XSLT 引擎 (Transformer 类 ) 的输出属性 , 可以控制 DOM Tree 中的内容的输出格式 , 这对于我们定制输出内容是很有帮助的。那么 JAXP 的 XSLT 引擎 (Transformer 类 ) 有那些输出属性可以设置呢 ? javax.xml.transform.OutputKeys 类定义了很多字符串常数 , 它们都是可以自由设置的输出属性 , 常用的输出属性如下所示 :

  1. public static final java.lang.String METHOD
    可以设为"xml"、"html"、"text"等值。
  2. public static final java.lang.String VERSION
    所遵循规范的版本号 , 如果 METHOD 设为"xml", 那么它的值应该设为"1.0", 如果 METHOD 设为"html", 那么它的值应该设为"4.0", 如果 METHOD 设为"text", 那么这个输出属性会被忽略。
  3. public static final java.lang.String ENCODING
    设置输出时所采用的编码方式 , 比如"GB2312"、"UTF-8"等等 , 如果将其设置为"GB2312", 可以解决所谓的"汉字问题"。
  4. public static final java.lang.String OMIT_XML_DECLARATION
    设置输出到 XML 文档中时是否忽略 XML 声明 , 亦即类似于 :
    <?xml version="1.0" standalone="yes" encoding="utf-8" ?>
    这样的代码。它可选的值有"yes"、"no"。
  5. public static final java.lang.String INDENT
    IDENT 设定 XSLT 引擎在输出 XML 文档时 , 是否自动添加额外的空格 , 它可选的值为"yes"、"no"。
  6. public static final java.lang.String MEDIA_TYPE
    MEDIA_TYPE 设定输出文档的 MIME 类型。

如果设定 XSLT 引擎的输出属性呢 ? 下面我们来总结一下 :

首先是获取 XSLT 引擎 (Transformer 类 ) 的缺省输出属性的集合 , 这需要使用 Transformer 类的 getOutputProperties() 方法 , 返回值是一个 java.util.Properties 对象。

Properties properties = transformer.getOutputProperties();
然后是设定新的输出属性 , 比如 :
properties.setProperty(OutputKeys.ENCODING,"GB2312");
properties.setProperty(OutputKeys.METHOD,"html");
properties.setProperty(OutputKeys.VERSION,"4.0");
………………………………………………………

最后是更新 XSLT 引擎 (Transformer 类 ) 的缺省输出属性的集合 , 这需要使用 Transformer 类的 setOutputProperties() 方法 , 参数是一个 java.util.Properties 对象。

我们编写了一个新的程序 , 其中应用了 OutputKeys 类 , 用以控制 XSLT 引擎的输出属性 , 该程序的架构和前一个程序 (AddRecord3.java) 大致相同 , 不过输出结果略有不同。完整的代码请参考下列文件 : AddRecord3.java( 见附件 )、 user.xml( 见附件 )。该例子的运行环境为 :Windows XP Professional、JDK 1.3.1。为了能够正常编译运行 AddRecord3.java这个程序 , 你需要到网址 http://java.sun.com去下载安装 JAXP 1.1 或者 Java XML Pack(Java XML Pack 内含 JAXP 了 )。


方法四 : 使用 Xalan XML Serializer

方法四其实是方法三的一个变种 , 它需要 Apache Xalan 和 Apache Xerces 的支持才能够运行。例子代码如下所示 :

	 // 首先创建一个 DOMSource 对象 , 该构造函数的参数可以是一个 Document 对象
 //doc 代表更改后的 DOM Tree。
	 DOMSource domSource = new DOMSource (doc); 	
	 // 创建一个 DOMResult 对象 , 临时保存 XSLT 引擎的输出结果。
	 DOMResult domResult = new DOMResult(); 
	 // 下面调用 JAXP 中的 XSLT 引擎来实现输出 DOM Tree 中的数据到 XML 文件中的功能。
	 //XSLT 引擎的输入为 DOMSource 对象 , 输出为 DOMResut 对象。
	 try 
	 { 
 // 首先创建一个 TransformerFactory 对象 , 再由此创建 Transformer 对象。Transformer 
 // 类相当于一个 XSLT 引擎。通常我们使用它来处理 XSL 文件 , 但是在这里我们使
 // 用它来输出 XML 文档。
		 TransformerFactory tf=TransformerFactory.newInstance(); 	
		 Transformer t=tf.newTransformer (); 	
		 // 设置 XSLT 引擎的属性 ( 必不可少 , 否则会产生"汉字问题")。
		 Properties properties = t.getOutputProperties();   
		 properties.setProperty(OutputKeys.ENCODING,"GB2312"); 
		 t.setOutputProperties(properties);   
		 // 关键的一步 , 	调用 Transformer 对象 (XSLT 引擎 ) 的 transform() 方法 , 该方法的第一
 // 个参数是 DOMSource 对象 , 第二个参数是 DOMResult 对象。
		 t.transform(domSource,domResult); 
		 // 创建缺省的 Xalan XML Serializer, 使用它将临时存放在 DOMResult 对象
 //(domResult) 中的内容以输出流的形式输出到输出介质中。
		 Serializer serializer = SerializerFactory.getSerializer 
        (OutputProperties.getDefaultMethodProperties("xml")); 
	 // 设置 Xalan XML Serializer 的输出属性 , 这一步必不可少 , 否则也可能产生
 // 所谓的"汉字问题"。
		 Properties prop=serializer.getOutputFormat(); 
		 prop.setProperty("encoding","GB2312"); 
		 serializer.setOutputFormat(prop); 
		 // 创建一个 File 对象 , 代表 DOM Tree 所包含的数据的输出介质 , 这是一个 XML 文件。
		 File f = new File ("xuser3.xml"); 
		 // 创建文件输出流对象 fos, 请留意构造函数的参数。
		 FileOutputStream fos=new FileOutputStream(f); 
		 // 设置 Xalan XML Serializer 的输出流。
		 serializer.setOutputStream(fos); 
		 // 串行化输出结果。
		 serializer.asDOMSerializer().serialize(domResult.getNode()); 
	 } 
	 catch (Exception tce) 
	 { 			
		 tce.printStackTrace(); 		
	 } 
	

这个方法不太常用 , 而且似乎有点画蛇添足 , 所以我们就不展开讨论了。完整的例子请参考下列文件 : AddRecord4.java( 见附件 )、 user.xml( 见附件 )。该例子的运行环境为 :Windows XP Professional、JDK 1.3.1。为了能够正常编译运行 AddRecord4.java这个程序 , 你需要到网址 http://xml.apache.org/dist/ 去下载安装 Apache Xalan 和 Apache Xerces。

或者是到网址 http://java.sun.com/xml/download.html去下载安装 Java XML Pack。因为最新的 Java XML Pack(Winter 01 版 ) 包含了 Apache Xalan 和 Apache Xerces 技术在内。


结论 :

本文简略的讨论了 Java 语言编程中更新 XML 文档的四种方法。第一种方法是直接读写 XML 文件 , 这种方法十分繁琐 , 而且比较容易出错 , 极少使用 , 除非你需要开发自己的 XML Parser, 否则不会使用这种方法。第二种方法是使用 Apache Crimson 的 XmlDocument 类 , 这种方法极为简单 , 使用方便 , 如果你选用 Apache Crimson 作为 XML 解析器 , 那么不妨使用这种方法 , 不过这种方法似乎效率不高 ( 源于效率低下的 Apache Crimson), 另外 , 高版本的 JAXP 或者是 Java XML Pack、JWSDP 不直接支持 Apache Crimson, 亦即这种方法不通用。第三种方法是使用 JAXP 的 XSLT 引擎 (Transformer 类 ) 来输出 XML 文档 , 这种方法也许是标准的方法了 , 使用起来十分灵活 , 特别是可以自如控制输出格式 , 我们推荐采用这种方法。第四种方法是第三种方法的变种 , 采用了 Xalan XML Serializer, 引入了串行化操作 , 对于大量文档的修改 / 输出有优越性 , 可惜的是要重复设置 XSLT 引擎的属性和 XML Serializer 的输出属性 , 比较麻烦 , 而且依赖于 Apache Xalan 和 Apache Xerces 技术 , 通用性略显不足。

除了上面讨论的四种方法以外 , 实际上应用别的 API( 比如 JDOM、Castor、XML4J、Oracle XML Parser V2) 也有很多办法可以更新 XML 文档 , 限于篇幅 , 在这里就不一一讨论了。


附件 :

AddRecord.java
AddRecord2.java
AddRecord3.java
AddRecord4.java
user.xml


参考资料

[1]The Java Web Services Tutorial, Sun Microsystems Inc.

[2] http://xml.apache.org,Apache XML Project(Crimson、Xerces、Xalan)

[3] http://www.jguru.com,XML Forum

[4] http://forum.java.sun.com,Java Technology & XML Forum

关于作者

黄理,北京大学四年级学生,对Java、XML技术深感兴趣,有长期编程经验。您可以通过 quantumfancy@hotmail.com与他联系。

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=Java technology
ArticleID=52950
ArticleTitle=Java 语言编程中更新 XML 文档的常用方法
publish-date=03042002
author1-email=quantumfancy@hotmail.com
author1-email-cc=quantumfancy@hotmail.com

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。