??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲av成人一区二区三区在线播放 ,亚洲成av人片天堂网老年人,666精品国产精品亚洲http://www.tkk7.com/su/category/525.htmll自׃个温馨的?/description>zh-cnFri, 02 Mar 2007 03:32:18 GMTFri, 02 Mar 2007 03:32:18 GMT60(转自IBM)?JDOM ?XML ~程http://www.tkk7.com/su/articles/1591.html温馨虫窝温馨虫窝Tue, 01 Mar 2005 06:59:00 GMThttp://www.tkk7.com/su/articles/1591.htmlhttp://www.tkk7.com/su/comments/1591.htmlhttp://www.tkk7.com/su/articles/1591.html#Feedback0http://www.tkk7.com/su/comments/commentRss/1591.htmlhttp://www.tkk7.com/su/services/trackbacks/1591.html作ؓ(f)开发h员,(zhn)可能听说过 80-20 规则Q在其它领域被称?Pareto 法则Q一U过E或Ҏ(gu)能适应所有可能情늚 80%Q另外的 20% 则需要根据具体情冉|处理。Y件开发的必然l果是:(x)对于开发h员而言Q有?jin)给定的技术后p非常Ҏ(gu)地完成可能要做的工作?80%?/FONT>

当然QY件品和标准q不LҎ(gu) 80-20 规则发展的。特别的QJava XML 的缺陷就是这条规则的一个例外。Java 的编E世界拥有很多的 API -- 一些是自己开发的Q一些是由几个大公司开发ƈ被制定ؓ(f)标准?-- 他们提供?jin)解决特D?XML d的成熟解x案。作?XML 普遍性的证明Q每个新d都存在着一U新技术,但如何将它们l合在一P又如何寻找一U合适的工具d成必重复做的Q务中?80% -- 利用 Java 语言的直观映象的基本 XML ?wi)操作?JDOM 正好是用来解决上q问题的一?XML API?/FONT>

标记QJava ?XML
在许多方面,Java 语言已变成供 XML 选择的一U编E语a。由?Apache 软g基金?x)?IBM alphaWorks 所做的开创性工作,现在已有完整的工具链用于创徏Q操作,传送文档和?XML 文档q行语法分析?/FONT>

但是Q虽然许?Java 开发h员每天都在?XMLQSun 却在?XML 整合q?Java q_斚w落后?jin)。因为在 XML 成ؓ(f)从商家对商家集成?Web 站点内容水化等斚w的关键技术之前,Java 2 q_已l非常流行了(jin)。Sun 已经使用 JSR q程使之成ؓ(f)现存 XML API 的E,q一点已被广泛接受。目前最显著的是加入?JAXP Q用?XML 语法分析?Java APIQ,其中包含?jin)三个Y件包Q?/FONT>

  • org.w3c.domQW(xu)3C 推荐的用?XML 标准规划文档对象模型?Java 工具
  • org.xml.saxQ用于对 XML q行语法分析的事仉动的?API
  • javax.xml.parsersQ工厂化工具Q允许应用程序开发h员获得ƈ配置Ҏ(gu)的语法分析器工具

管对于 Java 开发h员而言Q有?jin)这些Y件包是g好事Q但它仅仅代表获得了(jin)现有 API 标准的正式许可而已Qƈ没有在提供一的 Java-XML 互操作性方面取得了(jin)巨大飞跃。核?Java q_所~Z的是?XML 文档作ؓ(f) Java 对象操作的直观接口?/FONT>

q入 JDOM。JDOM 是两位著名的 Java 开发h员兼作者,Brett Mclaughlin ?Jason Hunter 的创作成果, 2000 q初在类g Apache 协议的许可下QJDOM 作ؓ(f)一个开放源代码目正式开始研发,JDOM 作ؓ(f)一个开放源代码目正式开始了(jin)。它已成长ؓ(f)包含来自q泛?Java 开发h员的投稿、集中反馈及(qing)错误修复的系l,q致力于建立一个完整的Z Java q_的解x案,通过 Java 代码来访问、操作ƈ输出 XML 数据?/FONT>

q是 JDOM 适合?API、哑?/B>
JDOM 能够替换 org.w3c.dom 软g包来有计划地操作 XML 文档。它q不是一个简单的替代品,实际?JDOM ?DOM 能够愉快地ƈ存。另外,管它提供的cȝ装从配|和q行分析器执行中分担?jin)大量工作,但它不负责根据文本输入来?XML q行语法分析。JDOM 建立在现有的 API 的能力之上,正如目|页所表述的“一个更好的捕鼠器”?/FONT>

要理解需要备?API 的原因,p考虑 W3C DOM 设计的局限性:(x)

  • 语言独立?/B>DOM q不是用Z?j)目中?Java 语言设计的。虽然这U方法保留了(jin)在不同语a中非常相似的 APIQ它也那些?fn)?Java 语言的程序员感到更麻?ch)。例如:(x)Java 语言内徏?jin)一U?String c,?DOM 则规范定义了(jin)自己?Text cR?BR>
  • 严格的层ơ结构?/B>DOM API 直接沿袭?XML 规范。在 XML 中,每g东西都是一个结点,因此(zhn)能?DOM 中找C个几乎每件东襉K可以扩展的基?Node 的接口和q回 Node 的一pdҎ(gu)。就多态性的观点来讲Q它是优U的,但鉴于如上解释,它在 Java 语言中的应用是困难而且不便的,其中?Node 向叶cd作显式下拉会(x)D代码的冗长和难以理解?BR>
  • 接口驱动?/B>公共 DOM API 仅由接口l成Q?CODE>Exception cL一个例外,但恰恰够了(jin)Q。w3c Ҏ(gu)供实现ƈ不感兴趣Q它只对定义接口Q比较有意义Q感兴趣。但它也意味着作ؓ(f) Java E序员(sh)?API 在创?XML 对象时增加了(jin)分散E度Q因?w3c 标准大量使用工厂化的cdcM的灵zȝ但不直接的模式。在某些应用中,XML 文档是仅p法分析器建立的,而从不会(x)由应用程序代码建立Q这是不相关的。但是,随着 XML 更广泛的使用Qƈ不是所有问题都l箋需要由语法分析器来驱动。应用程序的开发h员需要一个更方便的方法有计划地构?XML 对象?/FONT>

对于E序员,q些U束意味着庞大Q在内存占用和接口大方面)(j)的和难掌握的 APIQ学?fn)和使用都很难。相反,JDOM 是作ZU轻量 API 被制定的Q最主要的是它是?Java Z?j)的。它在遵?DOM 主要规则的基上除M(jin)上述~点Q?/FONT>

  • JDOM ?Java q_专用的?/B>只要有可能,API 都?Java 语言的内?String 支持Q因此文本g适用?String。它q可利用 Java 2 q_的类集,?List ?IteratorQ给E序员提供了(jin)一个丰富的q且?Java 语言cM的环境?BR>
  • 没有层次性?/B>?JDOM 中,XML 元素是 Element 的实例,XML 属性就?Attribute 的实例,XML 文档本n是 Document 的实例。由于在 XML 中所有这些都代表?jin)不同的概念Q因此它们L作ؓ(f)自己的类型被引用Q而不是作Z个含p的“结点”?BR>
  • c驱动?/B>因ؓ(f) JDOM 对象是?Document?CODE>Element ?Attribute q些cȝ直接实例Q因此创Z个新 JDOM 对象如?Java 语言中?new 操作W一样容易。它q意味着不需要进行工厂化接口配置 -- JDOM 的用是直截?jin)当的?/FONT>

看,没有 NodeQ徏立和操作 JDOM 文档
JDOM 使用标准?Java ~码模式。只要有可能Q它使用 Java new 操作W而不用复杂的工厂化模式,使对象操作即便对于初学用户也很方ѝ例如,让我们看一下如何随便?JDOM 建立一个简单的 XML 文档。我们将要徏立的l构如清?1 所C。(?A >参考资?/A>上可下蝲关于本文的完整代码)(j)

清单 1. 建立 XML 文档h

<?xml version="1.0" encoding="UTF-8"?>
<car vin="123fhg5869705iop90">
  <!--Description of a car-->
  <make>Toyota</make>
  <model>Celica</model>
  <year>1997</year>
  <color>green</color>
  <license state="CA">1ABC234</license>
</car>



注意Q我们将建立CZ文档Q在下面的清?2 到清?7 中有详细描述?/FONT>

开始,让我们先创徏一个根元素Qƈ其d到文档中Q?/FONT>

清单 2. 创徏一?Document

Element carElement = new Element("car");
Document myDocument = new Document(carElement);



q一步创Z个新 org.jdom.ElementQƈ其作ؓ(f) org.jdom.Document myDocument 的根元素。(如果(zhn)?A >参考资?/A>中提供的h代码Q请务必导入 org.jdom.*。)(j)因ؓ(f)一?XML 文档必须一直有一个唯一的根元素Q所?Document ?Element 攑֜它的构造器中?/FONT>

下一步,d vin 属性:(x)

清单 3. d一?Attribute

carElement.addAttribute(new Attribute("vin", "123fhg5869705iop90"));



d元素也是很简单的。这里我们添?make 元素Q?/FONT>

清单 4. 元素和子元素

Element make = new Element("make");
make.addContent("Toyota");
carElement.addContent(make);



׃ Element ?addContent Ҏ(gu)q回 ElementQ我们也可以q样写:(x)

清单 5. 用简zŞ式添加元?/B>

carElement.addContent(new Element("make").addContent("Toyota"));



q两个语句完成了(jin)相同的工作。有些h认ؓ(f)W一个示例可L更好,但是如果(zhn)一ơ徏立许多元素,(zhn)会(x)觉得W二个示例可L更好。要完成构徏文档Q?/FONT>

清单 6. d其余的元?/B>

carElement.addContent(new Element("model").addContent("Celica"));
carElement.addContent(new Element("year").addContent("1997"));
carElement.addContent(new Element("color").addContent("green"));
carElement.addContent(new Element("license")
    .addContent("1ABC234").addAttribute("state", "CA"));



(zhn)会(x)注意到对?license 元素Q我们不但添加了(jin)元素的内容,q(sh)ؓ(f)其添加了(jin)一个属性,表明许可已被发出?jin)这个状态。这是因?Element ?addContent Ҏ(gu)Lq回 Element 本nQ而不是一个无效的声明?/FONT>

用同L(fng)Ҏ(gu)d注释部分或其它标?XML cdQ?/FONT>

清单 7. d一条注?/B>

carElement.addContent(new Comment("Description of a car"));



操作文档也是用类似方式。例如,要引?year 元素Q我们?Element ?getChild Ҏ(gu)Q?/FONT>

清单 8. 讉K子元?/B>

Element yearElement = carElement.getChild("year");



该语句实际上返回第一个元素名?year 的子 Element?如果没有 year 元素Q则调用q回一个空倹{注意,我们不必回溯来自McM?DOM Node 接口的返回?-- Element 的子元素是 Element。用cM的方式,我们可把 year 元素从文档中除去Q?/FONT>

清单 9. 除去子元?/B>

boolean removed = carElement.removeChild("year");



q次调用只除去 year 元素Q文档的其余部分保持不变?/FONT>

到目前ؓ(f)止,我们已经늛?jin)文档的生成和操作。要完成的文档输出x制台Q可使用 JDOM ?XMLOutputter c:(x)

清单 10. ?JDOM 转化?XML 文本

try {
    XMLOutputter outputter = new XMLOutputter("  ", true);
    outputter.output(myDocument, System.out);
} catch (java.io.IOException e) {
    e.printStackTrace();
}



XMLOutputter 有几个格式选项。这里我们已指定希望子元素从父元素羃q两个空|q且希望元素间有I?CODE> XMLOutputter 可输出到 Writer ?OutputStream。ؓ(f)输出到文Ӟ我们可以单地输?gu)化ؓ(f)Q?/FONT>

清单 11. 使用 FileWriter 输出 XML

FileWriter writer = new FileWriter("/some/directory/myFile.xml");
outputter.output(myDocument, writer);
writer.close();



与其它方法良好协作:(x)和现有的 XML 工具q行互操?/B>
JDOM 的一个有特征是和其?API 有互操作性。?JDOMQ不仅能把文档输出到 Stream ?ReaderQ还可将文档作ؓ(f) SAX Event Stream 或作?DOM Document。这U灵zL允?JDOM 能在多种环境下用或被添加到已经在用另一U方法处?XML 的系l中厅R正如我们在后面一个示例中所看到的,它还允许 JDOM 使用其它的还?sh)能识?JDOM 的数据结构的 XML 工具?/FONT>

JDOM 的另一个用处是它能够读取ƈ操作现有?XML 数据。?org.jdom.input 中的一个类可以阅读l构很规范的 XML 文g。在q个CZ中我们?SAXBuilderQ?/FONT>

清单 12. 使用 SAXBuilder ?XML 文gq行语法分析

try {
  SAXBuilder builder = new SAXBuilder();
  Document anotherDocument = 
    builder.build(new File("/some/directory/sample.xml"));
} catch(JDOMException e) {
  e.printStackTrace();
} catch(NullPointerException e) {
  e.printStackTrace();
}



(zhn)可以用清单 2 到清?7 中显C的Ҏ(gu)来操作通过q个q程建立的文档?/FONT>

JDOM 的另一个实用应用程序将其与 Apache ?Xalan 产品l合在一P请参?A >参考资?/A>Q。用上面的汽RCZQ我们将为在U汽车经销商徏立一?Web 面Q显C特定汽车的详细信息。首先,假设我们上面建立的文档显C我们准备呈现给用户的汽车的信息。下一步,我们把q个 JDOM Document 与一?XSL 样式表结合v来ƈ?HTML 格式的结果输出到 servlet ?OutputStream 上以便在用户的浏览器中显C?/FONT>

在本例中Q我们准备用的 XSL 样式表被UCؓ(f) car.xslQ?/FONT>

清单 13. 用于汽车记录{换ؓ(f) HTML ?XSL 文档

<?xml version="1.0" encoding="UTF-8"?>

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:template match="/car">
    <html>
        <head>
          <title><xsl:value-of select="make"/> <xsl:value-of select="model"/>
        </head>
        <body>
          <h1><xsl:value-of select="make"/></h1><br />
          <h2><xsl:value-of select="model"/></h2><br />
          <table border="0">
          <tr><td>VIN:</td><td><xsl:value-of select="@vin"/></td></tr>
          <tr><td>Year:</td><td><xsl:value-of select="year"/></td></tr>
          <tr><td>Color:</td><td><xsl:value-of select="color"/></td></tr>
          </table>
        </body>
    </html>
  </xsl:template>
</xsl:stylesheet>



现在我们把 org.jdom.Document 转换?DOM DocumentQƈ其与显C我们的 XSL ?OutputStream 的文件一h供给 XalanQ?CODE>OutputStream 是我们从我们假定的?servletQ如清单 14 所C)(j)的应用服务器上获取的?/FONT>

清单 14. 使用 JDOM ?Xalan 创徏 HTML 文档
TransformerFactory tFactory = TransformerFactory.newInstance();

// Make the input sources for the XML and XSLT documents
org.jdom.output.DOMOutputter outputter = new org.jdom.output.DOMOutputter();
org.w3c.dom.Document domDocument = outputter.output(myDocument);
javax.xml.transform.Source xmlSource = 
  new javax.xml.transform.dom.DOMSource(domDocument);
StreamSource xsltSource = 
  new StreamSource(new FileInputStream("/some/directory/car.xsl"));

// Make the output result for the finished document using 
// the HTTPResponse OutputStream
StreamResult xmlResult = new StreamResult(response.getOutputStream());

// Get a XSLT transformer
Transformer transformer = tFactory.newTransformer(xsltSource);

// Do the transform
transformer.transform(xmlSource, xmlResult);

在这个示例中Q输出是通过 Java servlet ?HTTPResponse OutputStream 出。然而,输出可以象早期的?XMLOutputter 的实例一L(fng)单的通过文g输出。我们?DOMOutputter ?Xalan 生成 XML 源代码。但是我们可以生成相同的输出Q方法是使用 XMLOutputter 我们的 XML 文档作ؓ(f) String 输出q其进?StreamSource。说到灵zL:(x)JDOM 可将它的l构作ؓ(f) String、SAX Event Stream ?DOM Document 输出。这允许 JDOM 与能把Q何这些模型作入的工具一起工作。(关于附加功能Q请讉K JDOM Web 站点?contrib 包,在那里?zhn)发C个基?JDOM 工具的宝库,可提供基?JDBC ResultSet 的构建器、XPATH 实现Ҏ(gu)和其它更多工兗)(j)

在短短几行代码中QJDOM 启用?jin)许多功能,我们已经?XML 中分析过q有计划地创Z(jin) XML 文档Q操作了(jin)那些文档Qƈ使用它们产生 XML 驱动?Web 面?/FONT>

Sun ?JDOMQ名字里包含?jin)些什么?
JDOM ?1.0 正式发行版可能与其在 Java Community Process 中的一贯发展方向相W。作?JSR-102 提交?JDOM 已经批准成ؓ(f)?jin)核?Java q_的最l包含部分。Sun Ҏ(gu)的评hQ“JDOM 实明显地比早期?API 更易于用,因此我们怿它将成ؓ(f) Java q_有用的附加物。”据 JSR 透露QJDOM 1.0 发行版的包装可能?"org.jdom" 变(sh)ؓ(f) "javax.xml"。尽前景乐观,但开发h员可能最l不得不改变?sh)们的代码来使用C码?/FONT>

JDOM 的成长:(x)前景一?/B>
正如此文所提的那样QJDOM 目已经发布?jin)它?Beta 6 版本。甚臛_ beta 状态下Q对于许多真实世界中的实现方法来_(d)JDOM 已经被证明是E_的一U了(jin)。尽大部分?API 已经E_?jin),但在一些领域中仍在q行一些会(x)对现有的接口造成潜在影响的工作。因此,在这点上QQ何在q行的开发项目都不需要因为害怕一个错误多多的实现Ҏ(gu)而回?JDOMQ但是要考虑q样一个事实:(x)某些Ҏ(gu)l构或某些语义仍有可能在最l发布和被核?Java API 所采用之前发生改变。(请参?A >名字里包含了(jin)些什么?Q?/FONT>

JDOM 紧接着要做的是致力于稳?API q对实现Ҏ(gu)的各斚w性能问题?sh)出评估。其它方面有所q展Q但也造成?jin)对一些应用程序开发h员的ȝQ包括支?DTD 实体和其它不太常见的构造。沿着q条路再q一步就是对 XPATHQ它是一U象 XSLT q样的应用程序所Ҏ(gu)?XML 路径语言Q的核心(j)支持以及(qing)更多地集?XML 数据源?/FONT>

那么Q概况地_(d)JDOM 是否比现有的 XML API 好呢Q如果?zhn)梦?JavaQ那{案可能是“是的”。JDOM q意味着取代?zhn)所喜爱的语法分析或 XML 敏感型数据库Q但其设计原则有助于图掌?XML 世界的新?Java 开发h员提供快速的学习(fn)途径?/FONT>



温馨虫窝 2005-03-01 14:59 发表评论
]]>
Q{Q从 DOM 转换http://www.tkk7.com/su/articles/1589.html温馨虫窝温馨虫窝Tue, 01 Mar 2005 06:45:00 GMThttp://www.tkk7.com/su/articles/1589.htmlhttp://www.tkk7.com/su/comments/1589.htmlhttp://www.tkk7.com/su/articles/1589.html#Feedback0http://www.tkk7.com/su/comments/commentRss/1589.htmlhttp://www.tkk7.com/su/services/trackbacks/1589.html
如果(zhn)对 W3C ?DOMQ文档对象模型)(j)感兴而且认ؓ(f) SAX 很灵巧的话,那么(zhn)必LZU方法将 DOM 转换成应用程序开发h员(sh)用的其它格式。当?dng)q些其它格式是指 SAX ?JDOM。如果必d DOM 作ؓ(f)输入且要它转换成其它格式时Q要做什么?q当然是一个值得研究的问题。由?DOM 提供?jin)完整的文档表示Q将它{换成另外一U格式当然是可行的。在本文中,(zhn)将?jin)解如何执行?DOM ?SAX ?JDOM 的{换?BR>
?DOM ?SAX
遗憾的是QDOM U别 1 和更新的U别 2 没有提供?DOM ?wi)输出?SAX 或其它格式的方式。结果是每个语法分析器实现都提供?jin)一l用于输出的定制 APIQ实现的独立性׃(jin)。换句话_(d)(zhn)的代码只能与那个ؓ(f)它编写的语法分析器一起工作(?Crimson、Xerces ?Oracle {等Q。DOM U别 3 被认为是提供?jin)这功能,所以我们都必须?rn)?DOM U别 3 能提供什么输出方法。同Ӟ查看一下供应商提供的有关编写或串行?DOM ?wi)的文档。例如?Apache XercesQ需要用如清单 1 中所C的 org.apache.xml.serialize.XMLSerializer cR?在每一U情形,(zhn)将有可能必M的形式输出 DOM ?wi),然后这个流交?SAX q行后箋处理。请注意Q清?1 中仅昄?jin)以的形式输?DOM ?wi);然后可以使用q个作?SAX 处理器的输入?BR>
清单 1. ?DOM 转换成输出流Q供 SAX 使用Q?
import org.apache.xerces.parsers.DOMParser;
import org.apache.xml.serialize.XMLSerializer;
import org.xml.sax.InputSource;
import org.w3c.dom.Document;

public class PrintDOMTree {

public static void main(String[] args) {
try {
InputSource source = new InputSource(args[0]);
DOMParser parser = new DOMParser();
parser.parse(source);
Document doc = parser.getDocument();

XMLSerializer serializer = new XMLSerializer();
// Insert your PipedOutputStream here instead of System.out!
serializer.setOutputByteStream(System.out);
serializer.serialize(doc);
} catch (Exception e) {
e.printStackTrace();
}
}

}




?DOM ?JDOM
?DOM 转换?JDOM 要比?DOM 转换?SAX 单。这事实上很有意义,因ؓ(f)(zhn)一旦有?DOM ?wi),有可能有机会(x)?SAX 处理数据。事实上Q很有 SAX 最优处?DOM ?wi)的情况Q因为?zhn)通过 DOM 表示来将 XML 存储在内存里Ӟ已经用尽?jin)内存。更为常见的工作是把作ؓ(f) DOM ?wi)?XML 文档转换?JDOM ?wi)。由于这些格式都是文档表C,但在行ؓ(f)和功能性方面有潜在的不同,所以?zhn)可能惌其他人用?zhn)的 DOM ?wi)ƈ它当?JDOM q行处理。?zhn)可能认?f)q是他们的工作,但?zhn)需要知道(臛_Q)(j)如何从?zhn)的结构{换成他们的结构?BR>
对于?DOM 转换?JDOMQJDOM API 向用h供了(jin) DOM NodeQ称?org.jdom.input.DOMBuilder。这个类接受 DOM DocumentQ以?qing)其它一?DOM l构Q如 Element ?AttrQ,q将 DOM ?wi){换成 JDOM Document。这个操作ƈ不复杂,所以我在清?2 中简单地昄?jin)该代码Q让(zhn)了(jin)解一下实际过E?BR>
清单 2. ?DOM 转换?JDOM
// Java imports
import java.io.IOException;

// JDOM imports
import org.jdom.JDOMException;
import org.jdom.input.DOMBuilder; 
import org.jdom.output.XMLOutputter; 

// SAX and DOM
import org.xml.sax.InputSource;

// Xerces
import org.apache.xerces.parsers.DOMParser;

public class DOMtoJDOM {

// DOM tree of input document
org.w3c.dom.Document domDoc;

public DOMtoJDOM(String systemID) throws Exception {
DOMParser parser 
= new DOMParser();
parser.parse(
new InputSource(systemID));
domDoc 
= parser.getDocument();
}


public org.jdom.Document convert() 
throws JDOMException, IOException 
{

// Create new DOMBuilder, using default parser
DOMBuilder builder = new DOMBuilder();
org.jdom.Document jdomDoc 
= builder.build(domDoc);
return jdomDoc;
}


public static void main(String[] args) {
try {
DOMtoJDOM tester 
= new DOMtoJDOM(args[0]);
org.jdom.Document jdomDoc 
= tester.convert();

// Output the document to System.out
XMLOutputter outputter = new XMLOutputter();
outputter.output(jdomDoc, System.
out);
}
 catch (Exception e) {
e.printStackTrace();
}

}


}
 




没有别的要说?jin)。一旦?zhn)知道如何?DOM Ud SAX ?JDOM 之后Q就可以解决M(zhn)需要的输出格式q且能够处理(zhn)将遇到的许多类型的 XML 表示。静(rn)?DOM U别 3 规范Q以?jin)解对于以标准的且与供应商无关的方式输?DOM ?wi)的更改Q到那时Q?zhn)可以尽情?DOM ?jin)?BR>

温馨虫窝 2005-03-01 14:45 发表评论
]]>
Q{QJava语言~程中更新XML文档的常用方?/title><link>http://www.tkk7.com/su/articles/1587.html</link><dc:creator>温馨虫窝</dc:creator><author>温馨虫窝</author><pubDate>Tue, 01 Mar 2005 06:36:00 GMT</pubDate><guid>http://www.tkk7.com/su/articles/1587.html</guid><wfw:comment>http://www.tkk7.com/su/comments/1587.html</wfw:comment><comments>http://www.tkk7.com/su/articles/1587.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/su/comments/commentRss/1587.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/su/services/trackbacks/1587.html</trackback:ping><description><![CDATA[本文要的讨论?jin)Java语言~程中更新XML文档的四U常用方?q且分析q四U方法的优劣。其?本文q对如何控制JavaE序输出的XML文档的格式做?jin)展开?BR>JAXP是Java API for XML Processing的英文字头羃?中文含义?用于XML文档处理的用Java语言~写的编E接口。JAXP支持DOM、SAX、XSLT{标准。ؓ(f)?jin)增强JAXP使用上的灉|?开发者特别ؓ(f)JAXP设计?jin)一个Pluggability Layer,在Pluggability Layer的支持之?JAXP既可以和具体实现DOM API、SAX API 的各UXML解析?XML Parser,例如Apache Xerces)联合工作,又可以和具体执行XSLT标准的XSLT处理?XSLT Processor,例如Apache Xalan)联合工作。应用Pluggability Layer的好处在?我们只需要熟(zhn)JAXP各个~程接口的定义即?而不需要对所采用的具体的XML解析器、XSLT处理器有很深入的?jin)解。比如在某个JavaE序?通过JAXP调用XML解析器Apache Crimson对XML文档q行处理,如果我们希望使用别的XML解析?比如Apache Xerces),以便提高该程序的性能,那么原程序代码可能不需要Q何改?直接可以?你所需要做的事情只是将包含Apache Xerces代码的jar文g加入到环境变量CLASSPATH?而将包含Apache Crimson代码的jar文g在环境变量CLASSPATH中删??BR><BR>目前JAXP已经应用的十分普遍了(jin),可以说是Java语言中处理XML文档的标准API。有些初学者在学习(fn)使用JAXP的过E中,l常?x)提(gu)L(fng)问题:我编写的E序对DOM Tree做了(jin)更新,但是当程序退Z?原始的XML文档q没有改?q是老样?如何实现对原始XML文档和DOM Tree的同步更新呢?咋一看来,在JAXP中似乎没有提供相应的接口/Ҏ(gu)/c?q是很多初学者都感到困惑的问题。本文的L在于解册个问?单的介绍几种常用的同步更新原始XML文档和DOM Tree的方法。ؓ(f)?jin)羃(yu)讨论的范?本文所涉及(qing)的XML解析器仅包括Apache Crimson和Apache Xerces,而XSLT处理器仅仅用Apache Xalan?BR><BR>Ҏ(gu)一:直接dXML文档<BR><BR>q也许是最W最原始的办法了(jin)。当E序获取DOM Tree之后,应用DOM模型的Node接口的各个方法对DOM Treeq行更新,下一步应该对原始的XML文档q行更新?jin)。我们可以运用递归的办法或者是应用TreeWalkerc?遍历整个DOM Tree,与此同时,DOM Tree的每一个节?元素依次写入到预先打开的原始XML文档?当DOM Tree被遍历完全之?DOM Tree和原始的XML文档实C(jin)同步更新。实际中,q个Ҏ(gu)极少使用,不过如果你要~程实现自己的XML解析?q种Ҏ(gu)q是有可能用得上的?BR><BR>Ҏ(gu)?使用XmlDocumentc?BR><BR>使用XmlDocumentc?JAXP中分明没有这个类呀!是不是作者搞错了(jin)?没有?是使用XmlDocumentc?切的说,是用XmlDocumentcȝwrite()Ҏ(gu)?BR><BR>在上文已l提到过,JAXP可以和各U各L(fng)XML解析器联合?q次我们选用的XML解析器是Apache Crimson。XmlDocument(org.apache.crimson.tree.XmlDocument)是Apache Crimson的一个类,q不包含于标准的JAXP?难怪在JAXP的文档中找不到XmlDocumentcȝ芌呢。现在问题出来了(jin),如何应用XmlDocumentcL实现更新XML文档的功?在XmlDocumentcM提供?jin)下面三个write()Ҏ(gu)(Ҏ(gu)Crimson最新的版本------Apache Crimson 1.1.3):<BR><BR>public void write (OutputStream out) throws IOException<BR>public void write (Writer out) throws IOException<BR>public void write (Writer out, String encoding) throws IOException<BR><BR>上述三个write()Ҏ(gu)的主要作用就是输出DOM Tree中的内容到特定的输出介质?比如文g输出、应用程序控制台{等。那么又如何使用上述三个write()Ҏ(gu)?L(fng)下面的JavaE序代码片断:<BR><BR><BR>String name="fancy";<BR>DocumentBuilder parser;<BR>DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();<BR>try <BR>{<BR>parser = factory.newDocumentBuilder();<BR>Document doc = parser.parse("user.xml");<BR>Element newlink=doc.createElement(name);<BR>doc.getDocumentElement().appendChild(newlink);<BR>((XmlDocument)doc).write(new FileOutputStream(new File("xuser1.xml")));<BR>}<BR>catch (Exception e) <BR>{<BR>//to log it <BR>}<BR><BR><BR><BR><BR>在上面的代码?首先创徏?jin)一个Document对象doc,获取完整的DOM Tree,然后应用Node接口的appendChild()Ҏ(gu),在DOM Tree的最后追加了(jin)一个新节点(fancy),最后调用XmlDocumentcȝwrite(OutputStream out)Ҏ(gu),把DOM Tree中的内容输出到xuser.xml?其实也可以输出到user.xml,更新原始的XML文档,在这里ؓ(f)?jin)便于做?gu),故而输出到xuser.xml文g?。需要注意的是不能直接对Document对象doc直接调用write()Ҏ(gu),因ؓ(f)JAXP的Document接口q没有定义Q何write()Ҏ(gu),所以必ddoc由Document对象强制转换为XmlDocument对象,然后才能调用write()Ҏ(gu),在上面的代码中用的是write(OutputStream out)Ҏ(gu),q个Ҏ(gu)使用~省的UTF-8~码输出DOM Tree中的内容到特定的输出介质?如果DOM Tree中包含中文字W?那么输出的结果有可能是ؕ?亦即存在所谓的"汉字问题",解决的办法是使用write (Writer out, String encoding)Ҏ(gu),昑ּ指定输出时的~码,例如第二个参数设ؓ(f)"GB2312",q时即不存在"汉字问题",输出l果能够正常昄中文字符?BR><BR>完整的例子请参考下列文? AddRecord.java(见附?、user.xml(见附?。该例子的运行环境ؓ(f):Windows XP Professional、JDK 1.3.1。ؓ(f)?jin)能够正常编译运行AddRecord.javaq个E序,你需要到|址http://xml.apache.org/dist/crimson/M载Apache Crimson,q将所获取的crimson.jar文g加入到环境变量CLASSPATH中?BR><BR>注意:<BR><BR>Apache Crimson的前w是Sun Project X Parser,后来不知何故,由X Parser演变?sh)Apache Crimson,至今Apache Crimson的很多代码都是从X Parser中直接移植过来的。比如上文用到的XmlDocumentc?它在X Parser中是com.sun.xml.XmlDocument,C(jin)Apache Crimson中摇w一?变成了(jin)org.apache.crimson.tree.XmlDocumentc?其实它们的绝大部分代码是一L(fng),可能package语句和import语句以及(qing)文g开头的一Dlience有所不同而已。早期的JAXP是和X Parser捆绑在一L(fng),因此一些老的E序使用?jin)com.sun.xml?如果你现在重新编译它?有可能不能通过,肯定是因ؓ(f)q个原因。后来的JAXP和Apache Crimson捆绑在一?比如JAXP 1.1,如果你用JAXP 1.1,那么不需要额外下载Apache Crimson,也能够正常编译运行上面的例子(AddRecord.java)。最新的JAXP 1.2 EA(Early Access)改u更张,采用性能更好的Apache Xalan和Apache Xerces分别作ؓ(f)XSLT处理器和XML解析?不能直接支持Apache Crimson?所以如果你的开发环境采用了(jin)JAXP 1.2 EA或者是Java XML Pack(内含JAXP 1.2 EA),那么无法直接编译运行上面的例子(AddRecord.java),你需要额外下载ƈ安装Apache Crimson?BR><BR>Ҏ(gu)?使用TransformerFactory和Transformerc?BR><BR>在JAXP中所提供的标准的更新原始XML文档的方法就是调用XSLT引擎,亦即使用TransformerFactory和TransformercR请看下面的Java代码片断:<BR><BR><BR>//首先创徏一个DOMSource对象,该构造函数的参数可以是一个Document对象<BR>//doc代表更改后的DOM Tree?BR>DOMSource doms = new DOMSource (doc);<BR><BR>//创徏一个File对象,代表DOM Tree所包含的数据的输出介质,q是一个XML文g?BR>File f = new File ("XMLOutput.xml");<BR><BR>//创徏一个StreamResult对象,该构造函数的参数可以取ؓ(f)File对象?BR>StreamResult sr = new StreamResult (f);<BR><BR>//下面调用JAXP中的XSLT引擎来实现输出DOM Tree中的数据到XML文g中的功能?BR>//XSLT引擎的输入ؓ(f)DOMSource对象,输出为StreamResut对象?BR>try <BR>{<BR>//首先创徏一个TransformerFactory对象,再由此创建Transformer对象。Transformer<BR>//cȝ当于一个XSLT引擎。通常我们使用它来处理XSL文g,但是在这里我们<BR>//用它来输出XML文档?BR>TransformerFactory tf=TransformerFactory.newInstance(); <BR>Transformer t=tf.newTransformer ();<BR><BR>//关键的一? 调用Transformer对象 (XSLT引擎)的transform()Ҏ(gu),该方法的W一<BR>//个参数是DOMSource对象,W二个参数是StreamResult对象?BR>t.transform(doms,sr); <BR>}<BR>catch (TransformerConfigurationException tce)<BR>{ <BR>System.out.println("Transformer Configuration Exception\n-----");<BR>tce.printStackTrace(); <BR>}<BR>catch (TransformerException te) <BR>{ <BR>System.out.println ("Transformer Exception\n---------"); <BR>te.printStackTrace (); <BR>} <BR><BR><BR><BR><BR>在实际的应用?我们可以应用传统的DOM API从XML文档中获取DOM Tree,然后Ҏ(gu)实际的需求对DOM Tree执行各种操作,得到最l的Document对象,接下来可以由此Document对象创徏DOMSource对象,剩下的事情就是照搬上面的代码?E序q行完毕? XMLOutput.xml是你所需要的l果(当然?你可以随意更改StreamResultcL造函数的参数,指定不同的输Z?而不必是千篇一律的XML文档)?BR><BR>q个Ҏ(gu)最大的好处在于可以随心(j)所Ʋ的控制DOM Tree中的内容输出到输Z质中的格?但是光靠TransformerFactorycdTransformercdƈ不能实现q个功能,q需要依赖OutputKeyscȝ帮助?完整的例子请参考下列文? AddRecord2.java(见附?、user.xml(见附?。该例子的运行环境ؓ(f):Windows XP Professional、JDK 1.3.1。ؓ(f)?jin)能够正常编译运行AddRecord2.javaq个E序,你需要到|址http://java.sun.com/M载安装JAXP 1.1或者Java XML Pack(Java XML Pack已经内含JAXP??BR><BR>OutputKeysc?BR><BR>javax.xml.transform.OutputKeyscdjava.util.Propertiesc配合?可以控制JAXP的XSLT引擎(Transformerc?输出XML文档的格式。请看下面的代码片断:<BR><BR><BR>//首先创徏一个TransformerFactory对象,再由此创建Transformer对象?BR>TransformerFactory tf=TransformerFactory.newInstance(); <BR>Transformer t=tf.newTransformer ();<BR><BR>//获取Transformser对象的输出属?亦即XSLT引擎的缺省输出属?q是一?BR>//java.util.Properties对象?BR>Properties properties = t.getOutputProperties(); <BR><BR>//讄新的输出属?输出字符~码为GB2312,q样可以支持中文字符,XSLT引擎所输出<BR>//的XML文档如果包含?jin)中文字W?可以正常昄,不会(x)出现所谓的"汉字问题"?BR>//L(fng)意OutputKeyscȝ字符串常数OutputKeys.ENCODING?BR>properties.setProperty(OutputKeys.ENCODING,"GB2312"); <BR><BR>/更新XSLT引擎的输出属性?BR>t.setOutputProperties(properties); <BR><BR>//调用XSLT引擎,按照输出属性中的设|?输出DOM Tree中的内容到输Z质中?BR>t.transform(DOMSource_Object,StreamResult_Object); <BR><BR><BR><BR><BR>从上面的E序代码,我们不难看出,通过讄XSLT引擎(Transformerc?的输出属?可以控制DOM Tree中的内容的输出格?q对于我们定制输出内Ҏ(gu)很有帮助的。那么JAXP的XSLT引擎(Transformerc?有那些输出属性可以设|呢? javax.xml.transform.OutputKeyscd义了(jin)很多字符串常?它们都是可以自由讄的输出属?常用的输出属性如下所C?<BR><BR>public static final java.lang.String METHOD <BR>可以设ؓ(f)"xml"?html"?text"{倹{?<BR>public static final java.lang.String VERSION<BR>所遵@规范的版本号,如果METHOD设ؓ(f)"xml",那么它的值应该设?1.0",如果METHOD设ؓ(f)"html",那么它的值应该设?4.0",如果METHOD设ؓ(f)"text",那么q个输出属性会(x)被忽略?<BR>public static final java.lang.String ENCODING<BR>讄输出时所采用的编码方?比如"GB2312"?UTF-8"{等,如果其讄?GB2312",可以解决所谓的"汉字问题"?<BR>public static final java.lang.String OMIT_XML_DECLARATION<BR>讄输出到XML文档中时是否忽略XML声明,亦即cM?<BR><?xml version="1.0" standalone="yes" encoding="utf-8" ?><BR>q样的代码。它可选的值有"yes"?no"?<BR>public static final java.lang.String INDENT<BR>IDENT讑֮XSLT引擎在输出XML文档?是否自动d额外的空?它可选的gؓ(f)"yes"?no"?<BR>public static final java.lang.String MEDIA_TYPE<BR>MEDIA_TYPE讑֮输出文档的MIMEcd?<BR>如果讑֮XSLT引擎的输出属性呢?下面我们来ȝ一?<BR><BR>首先是获取XSLT引擎(Transformerc?的缺省输出属性的集合,q需要用TransformercȝgetOutputProperties()Ҏ(gu),q回值是一个java.util.Properties对象?BR><BR>Properties properties = transformer.getOutputProperties();<BR>然后是设定新的输出属?比如:<BR>properties.setProperty(OutputKeys.ENCODING,"GB2312");<BR>properties.setProperty(OutputKeys.METHOD,"html");<BR>properties.setProperty(OutputKeys.VERSION,"4.0");<BR>……………………………………………………?BR><BR>最后是更新XSLT引擎(Transformerc?的缺省输出属性的集合,q需要用TransformercȝsetOutputProperties()Ҏ(gu),参数是一个java.util.Properties对象?BR><BR>我们~写?jin)一个新的程?其中应用?jin)OutputKeysc?用以控制XSLT引擎的输出属?该程序的架构和前一个程?AddRecord3.java)大致相同,不过输出l果略有不同。完整的代码请参考下列文? AddRecord3.java(见附?、user.xml(见附?。该例子的运行环境ؓ(f):Windows XP Professional、JDK 1.3.1。ؓ(f)?jin)能够正常编译运行AddRecord3.javaq个E序,你需要到|址http://java.sun.com/M载安装JAXP 1.1或者Java XML Pack(Java XML Pack内含JAXP??BR><BR>Ҏ(gu)?使用Xalan XML Serializer<BR><BR>Ҏ(gu)四其实是Ҏ(gu)三的一个变U?它需要Apache Xalan和Apache Xerces的支持才能够q行。例子代码如下所C?<BR><BR><BR>//首先创徏一个DOMSource对象,该构造函数的参数可以是一个Document对象<BR>//doc代表更改后的DOM Tree?BR>DOMSource domSource = new DOMSource (doc); <BR><BR>//创徏一个DOMResult对象,临时保存XSLT引擎的输出结果?BR>DOMResult domResult = new DOMResult();<BR><BR>//下面调用JAXP中的XSLT引擎来实现输出DOM Tree中的数据到XML文g中的功能?BR>//XSLT引擎的输入ؓ(f)DOMSource对象,输出为DOMResut对象?BR>try <BR>{<BR>//首先创徏一个TransformerFactory对象,再由此创建Transformer对象。Transformer<BR>//cȝ当于一个XSLT引擎。通常我们使用它来处理XSL文g,但是在这里我们<BR>//用它来输出XML文档?BR>TransformerFactory tf=TransformerFactory.newInstance(); <BR>Transformer t=tf.newTransformer (); <BR><BR>//讄XSLT引擎的属?必不可少,否则?x)?汉字问题")?BR>Properties properties = t.getOutputProperties(); <BR>properties.setProperty(OutputKeys.ENCODING,"GB2312");<BR>t.setOutputProperties(properties); <BR><BR>//关键的一? 调用Transformer对象 (XSLT引擎)的transform()Ҏ(gu),该方法的W一<BR>//个参数是DOMSource对象,W二个参数是DOMResult对象?BR>t.transform(domSource,domResult);<BR><BR>//创徏~省的Xalan XML Serializer,使用它将临时存放在DOMResult对象<BR>//(domResult)中的内容以输出流的Ş式输出到输出介质中?BR>Serializer serializer = SerializerFactory.getSerializer<BR>(OutputProperties.getDefaultMethodProperties("xml"));<BR><BR>//讄Xalan XML Serializer的输出属?q一步必不可?否则也可能?BR>//所谓的"汉字问题"?BR>Properties prop=serializer.getOutputFormat();<BR>prop.setProperty("encoding","GB2312");<BR>serializer.setOutputFormat(prop);<BR><BR>//创徏一个File对象,代表DOM Tree所包含的数据的输出介质,q是一个XML文g?BR>File f = new File ("xuser3.xml");<BR><BR>//创徏文g输出对象fos,L(fng)意构造函数的参数?BR>FileOutputStream fos=new FileOutputStream(f);<BR><BR>//讄Xalan XML Serializer的输出流?BR>serializer.setOutputStream(fos);<BR><BR>//串行化输出结果?BR>serializer.asDOMSerializer().serialize(domResult.getNode());<BR>}<BR>catch (Exception tce)<BR>{ <BR>tce.printStackTrace(); <BR>}<BR><BR><BR><BR><BR>q个Ҏ(gu)不太常用,而且g有点画蛇添,所以我们就不展开讨论?jin)。完整的例子请参考下列文? AddRecord4.java(见附?、user.xml(见附?。该例子的运行环境ؓ(f):Windows XP Professional、JDK 1.3.1。ؓ(f)?jin)能够正常编译运行AddRecord4.javaq个E序,你需要到|址http://xml.apache.org/dist//M载安装Apache Xalan和Apache Xerces?BR><BR>或者是到网址http://java.sun.com/xml/download.htmlM载安装Java XML Pack。因为最新的Java XML Pack(Winter 01 ?包含?jin)Apache Xalan和Apache Xerces技术在内?BR><BR>l论:<BR><BR>本文略的讨论?jin)Java语言~程中更新XML文档的四U方法。第一U方法是直接dXML文g,q种Ҏ(gu)十分J琐,而且比较Ҏ(gu)出错,极少使用,除非你需要开发自qXML Parser,否则不会(x)使用q种Ҏ(gu)。第二种Ҏ(gu)是用Apache Crimson的XmlDocumentc?q种Ҏ(gu)极ؓ(f)?使用方便,如果你选用Apache Crimson作ؓ(f)XML解析?那么不妨使用q种Ҏ(gu),不过q种Ҏ(gu)g效率不高(源于效率低下的Apache Crimson),另外,高版本的JAXP或者是Java XML Pack、JWSDP不直接支持Apache Crimson,亦即q种Ҏ(gu)不通用。第三种Ҏ(gu)是用JAXP的XSLT引擎(Transformerc?来输出XML文档,q种Ҏ(gu)也许是标准的Ҏ(gu)?使用h十分灉|,特别是可以自如控制输出格?我们推荐采用q种Ҏ(gu)。第四种Ҏ(gu)是第三种Ҏ(gu)的变U?采用?jin)Xalan XML Serializer,引入?jin)串行化操?对于大量文档的修?输出有优?可惜的是要重复设|XSLT引擎的属性和XML Serializer的输出属?比较ȝ(ch),而且依赖于Apache Xalan和Apache Xerces技?通用性略显不?BR><BR>除了(jin)上面讨论的四U方法以?实际上应用别的API(比如JDOM、Castor、XML4J、Oracle XML Parser V2)也有很多办法可以更新XML文档,限于幅,在这里就不一一讨论?jin)?BR><img src ="http://www.tkk7.com/su/aggbug/1587.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/su/" target="_blank">温馨虫窝</a> 2005-03-01 14:36 <a href="http://www.tkk7.com/su/articles/1587.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://ax445.com" target="_blank">˳ƵƵ</a>| <a href="http://wbkk88.com" target="_blank">99߹ۿƵ</a>| <a href="http://51xinshiji.com" target="_blank">ɫƷƵ</a>| <a href="http://saohuo7.com" target="_blank">Ƶ</a>| <a href="http://wusongtv.com" target="_blank">޹ƷVA߿</a>| <a href="http://iguasheng.com" target="_blank">˳Ƶ</a>| <a href="http://kkjk123.com" target="_blank">ƷϵƵ </a>| <a href="http://se988.com" target="_blank">޹ҹƷƬ߲</a>| <a href="http://amjt9.com" target="_blank">Ѱvվ߹ۿg</a>| <a href="http://shenghe228.com" target="_blank">VAѾƷ</a>| <a href="http://clzqb2b.com" target="_blank">˾þô߽ӰԺ</a>| <a href="http://18eeuus.com" target="_blank">AVѲ </a>| <a href="http://jl910.com" target="_blank">aaƵ</a>| <a href="http://www42iii.com" target="_blank">avһ</a>| <a href="http://600c20.com" target="_blank">ŮվƵ </a>| <a href="http://haoda8.com" target="_blank">Ļ˳й</a>| <a href="http://xxxck.com" target="_blank">Ʒר߹ۿ</a>| <a href="http://youketech.com" target="_blank">þAV뾫Ʒ</a>| <a href="http://yijiazhiwei.com" target="_blank">й߹ۿѸ</a>| <a href="http://zz198.com" target="_blank">޾Ʒ㶮</a>| <a href="http://yiuzz.com" target="_blank">ŷղvؼëƬ</a>| <a href="http://maomi90.com" target="_blank">þþþþ޾Ʒ</a>| <a href="http://kssijia.com" target="_blank">þþѵľƷ</a>| <a href="http://726zh.com" target="_blank">޾ɫ߲</a>| <a href="http://22222xxx.com" target="_blank">ѹһػƾþ</a>| <a href="http://wcnmgb.com" target="_blank">69˳鶹Ƶ</a>| <a href="http://0101av.com" target="_blank">AVһ</a>| <a href="http://kmc19.com" target="_blank">91͵߹ۿ</a>| <a href="http://bdgxhome.com" target="_blank">޳AVƬһ</a>| <a href="http://ax445.com" target="_blank">޹Ʒ˿߹ۿ</a>| <a href="http://blcvs.com" target="_blank">һ</a>| <a href="http://www3ratcom.com" target="_blank">պëƬһƵ</a>| <a href="http://51708695.com" target="_blank">һƷĻ</a>| <a href="http://cjsyw123.com" target="_blank">ۺav뾫Ʒһ </a>| <a href="http://bjgelinhotel.com" target="_blank">Aһ </a>| <a href="http://jiuse54.com" target="_blank">޾Ʒþ</a>| <a href="http://yiuzz.com" target="_blank">޾糡ҹ߹ۿ</a>| <a href="http://www-333346.com" target="_blank">avҹƷһ</a>| <a href="http://yy1288.com" target="_blank">һӰ߿Ƭ</a>| <a href="http://ztsf6688.com" target="_blank">99Ƶ߿</a>| <a href="http://blblkj.com" target="_blank">ѹۿhƬ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>