`

基于xsl模板技术把XML转成JSON

    博客分类:
  • Java
阅读更多
XSL摸板 xml-2-json.xml
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" exclude-result-prefixes="ebl">
    <!--====================================================================================
    Original version by : Holten Norris ( holtennorris at yahoo.com )
    Current version maintained  by: Alan Lewis (alanlewis at gmail.com)
    Thanks to Venu Reddy from eBay XSLT team for help with the array detection code
    Protected by CDDL open source license. 
    Transforms XML into JavaScript objects, using a JSON format.
    ===================================================================================== -->
    <xsl:output method="text" encoding="UTF-8"/>
    <xsl:template match="*">
        <xsl:param name="recursionCnt">0</xsl:param>
        <xsl:param name="isLast">1</xsl:param>
        <xsl:param name="inArray">0</xsl:param>
        <xsl:if test="$recursionCnt=0">
            <xsl:text>json = {</xsl:text>
        </xsl:if>
        <!-- test what type of data to output  -->
        <xsl:variable name="elementDataType">
            <xsl:value-of select="number(text())"/>
        </xsl:variable>
        <xsl:variable name="elementData">
            <!-- TEXT ( use quotes ) -->
            <xsl:if test="string($elementDataType) ='NaN'">
                <xsl:if test="boolean(text())">
                <xsl:if test="not(*)">
                "<xsl:value-of select="text()"/>"
                </xsl:if>
                </xsl:if>
            </xsl:if>
            <!-- NUMBER (no quotes ) -->
            <xsl:if test="string($elementDataType) !='NaN'">
                <xsl:value-of select="text()"/>
            </xsl:if>
            <!-- NULL -->
            <xsl:if test="not(*)">
                <xsl:if test="not(text())">
                    null
                </xsl:if>
            </xsl:if>
        </xsl:variable>
        <xsl:variable name="hasRepeatElements">
            <xsl:for-each select="*">
                <xsl:if test="name() = name(preceding-sibling::*) or name() = name(following-sibling::*)">
                    true
                </xsl:if>
            </xsl:for-each>
        </xsl:variable>
        <xsl:if test="not(count(@*) &gt; 0)">
         "<xsl:value-of select="local-name()"/>": <xsl:value-of select="$elementData"/>
        </xsl:if>
        <xsl:if test="count(@*) &gt; 0">
        "<xsl:value-of select="local-name()"/>": {
        "content": <xsl:value-of select="$elementData"/>
            <xsl:for-each select="@*">
                <xsl:if test="position()=1">,</xsl:if>
                <!-- test what type of data to output  -->
                <xsl:variable name="dataType">
                    <xsl:value-of select="number(.)"/>
                </xsl:variable>
                <xsl:variable name="data">
                    <!-- TEXT ( use quotes ) -->
                    <xsl:if test="string($dataType) ='NaN'">
                "<xsl:value-of select="current()"/>" </xsl:if>
                    <!-- NUMBER (no quotes ) -->
                    <xsl:if test="string($dataType) !='NaN'">
                        <xsl:value-of select="current()"/>
                    </xsl:if>
                </xsl:variable>
                <xsl:value-of select="local-name()"/>:<xsl:value-of select="$data"/>
                <xsl:if test="position() !=last()">, </xsl:if>
            </xsl:for-each>
        }
        </xsl:if>
        <xsl:if test="not($hasRepeatElements = '')">
                    [{
                </xsl:if>
        <xsl:for-each select="*">
            <xsl:if test="position()=1">
                <xsl:if test="$hasRepeatElements = ''">
                    <xsl:text> { </xsl:text>
                </xsl:if>
            </xsl:if>
            <xsl:apply-templates select="current()">
                <xsl:with-param name="recursionCnt" select="$recursionCnt+1"/>
                <xsl:with-param name="isLast" select="position()=last()"/>
                <xsl:with-param name="inArray" select="not($hasRepeatElements = '')"/>
            </xsl:apply-templates>
            <xsl:if test="position()=last()">
                <xsl:if test="$hasRepeatElements = ''">
                    <xsl:text> } </xsl:text>
                </xsl:if>
            </xsl:if>
        </xsl:for-each>
        <xsl:if test="not($hasRepeatElements = '')">
                    }]
                </xsl:if>
        <xsl:if test="not( $isLast )">
            <xsl:if test="$inArray = 'true'">
                <xsl:text> } </xsl:text>
            </xsl:if>
            ,
            <xsl:if test="$inArray = 'true'">
                <xsl:text> { </xsl:text>
            </xsl:if>
        </xsl:if>
        <xsl:if test="$recursionCnt=0"> }; </xsl:if>
    </xsl:template>
</xsl:stylesheet>


JAVA代码
public class XmlJson {
public static  String process(String resrouce, String xslFile) {
URL oUrl = XmlJson.class.getResource("/");
File oFileurl = new File(oUrl.getFile());
xslFile = oFileurl.getAbsolutePath() +"\\"+ xslFile;
StringWriter out = new StringWriter();
try {
TransformerFactory transFactory = TransformerFactory.newInstance();
StreamSource streamSourcexslt = new StreamSource(xslFile);
StreamSource streamSourcexml = new StreamSource(new StringReader(
resrouce));
Transformer xsltTransformer = transFactory
.newTransformer(streamSourcexslt);
xsltTransformer.transform(streamSourcexml, new StreamResult(out));
} catch (TransformerConfigurationException tce) {
System.out.println("ERROR: TransformerConfigurationException "
+ tce);
tce.printStackTrace();

} catch (TransformerException te) {
System.out.println("ERROR: TransformerException " + te);
te.printStackTrace();

}

return out.toString();
}
 
public static String open(String url, String s) {
URL oUrl = XmlJson.class.getResource("/");
File oFileurl = new File(oUrl.getFile());
url = oFileurl.getAbsolutePath()+"\\" + url;
Document oDocument = null;
if (url.length() > 0) {
SAXReader reader = new SAXReader();
try {
oDocument = reader.read(url);

} catch (DocumentException e) {
try {
if (null != s) {
if (s.length() > 0) {
oDocument = DocumentHelper.parseText(s);
}
}
File oFile = new File(url);
url = oFile.getParent();
if (null != url)
oFile = new File(url);
oFile.mkdirs();
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
return oDocument.asXML();
}
public static void main(String[] args){
String xml=XmlJson.open("rsp.xml","<rsp/>");

  //   long end=System.currentTimeMillis()-begin;
System.out.println(XmlJson.process(xml, "xml-2-json.xml"));
    
}
}

改技术性能比较差,100次需要7秒.用json-lib直接用对象转成xml会比较快,1W次0.7秒的
分享到:
评论

相关推荐

    xslt-xml2json:基于XSLT1.0的XML到JSON的转换器

    在标题提到的“xslt-xml2json”项目中,开发者已经实现了一个基于XSLT1.0的XML到JSON转换器。这个转换器的核心是利用XSLT的模板匹配和数据转换能力,将XML的树状结构映射到JSON的键值对结构。以下是一些关键知识点:...

    xml转换教程,ppt和示例代码

    - **模式匹配**:指定何时应用某个模板,基于元素的名称或其他特性。 2. **XSLT转换过程**: - **选择源节点**:根据样式表中的模式匹配,确定要处理的XML节点。 - **应用模板**:对选定的节点,执行相应的模板...

    Jmeter报告模板文件-jmeter.results.zyanycall.me.xsl

    原版的模板文件有免费资源我知道,但这个是我再次加工升级的文件,来自jmeter.results.shanhe.me.xsl。为了便于区分,我将名字做了修改。 我之前上传的jmeter.results.shanhe.me.xsl没有这个功能强大和实用。 功能...

    XML$XSLT$HTML$JAVASCRIPT转换实例

    6. JSON与XML互转:在某些情况下,XML数据可能需要先转换为JSON格式,因为JavaScript更自然地处理JSON数据。 总之,这个实例展示了XML、XSLT、HTML和JavaScript在Web开发中的协同工作,提供了一种灵活的方法来处理...

    XML高级编程9、10、11章

    在第9章中,主要探讨的是如何将XML数据转换成其他格式,最常见的工具是XSLT(Extensible Stylesheet Language Transformations)。XSLT允许开发者定义规则,将XML文档转换为HTML、PDF或其他XML文档,以适应不同的...

    [xslt]xml文件

    XSLT提供了丰富的功能,包括条件判断(`&lt;xsl:if&gt;`)、循环(`&lt;xsl:for-each&gt;`)、模板匹配(`&lt;xsl:template&gt;`)以及函数调用等,使得XML数据可以根据需要被灵活地呈现和转换。 在实际应用中,XSLT通常与XML解析器...

    xml高级编程4(主页可下载其余部分)

    XSLT使用模板匹配和样式表来定义转换规则,是处理XML数据的强大工具。 5. **命名空间**:在XML中,命名空间用于区分相同标签名但来自不同源的情况。通过引入命名空间前缀和URL,可以避免元素名冲突,确保XML文档的...

    XML高级编程 XML高级编程

    XML和JSON各有优缺点,XML在结构和规范性上更强,JSON则在简洁性和易读性上有优势。 10. **XML在配置管理中的应用**:许多应用程序和框架如Spring框架,使用XML文件来配置组件和行为,提供了一种灵活和可扩展的方式...

    XML实用教程课程2006

    9. **XML与JSON的对比**:虽然JSON(JavaScript Object Notation)近年来更受青睐,但XML因其丰富的元数据支持和自我描述性,在某些场景下仍具有优势。XML的复杂性可能增加处理成本,但JSON的简洁性则利于快速解析和...

    XML编程技术大全光盘中的源代码

    - 通过模板匹配和控制流指令,实现XML到XML的转换。 7. **DOM(Document Object Model)**: - DOM是XML文档的树形表示,允许程序对XML进行动态操作。 - 通过DOM,可以添加、删除、修改元素和属性。 8. **SAX...

    《XML实用大全》.doc

    - **与SOAP的关系**: SOAP(Simple Object Access Protocol)是一种基于XML的消息协议,用于交换应用间的数据。 #### 六、学习资源推荐 - **官方文档**: W3C官方网站提供了大量的XML相关文档和技术规范。 - **在线...

    跟我学xml

    9. **XML和JSON的比较**:XML和JSON(JavaScript Object Notation)都是数据交换格式,但JSON更简洁、轻量级,常用于Web应用程序。对比两者优缺点,根据实际需求选择合适的格式。 通过深入学习并实践这些知识点,你...

    XML 高级编程(7).rar.rar

    3. **XSLT**:XSL(Extensible Stylesheet Language)转换用于将XML文档转换成其他格式,如HTML、PDF或者纯文本。XSLT通过定义模板来控制转换过程,使得数据呈现方式可以根据需求定制。 4. **DOM(Document Object ...

    XML基础教程

    8. **XSLT**:XSL(可扩展样式表语言)的转换部分,用于将XML转换成其他格式,如HTML或PDF。XSLT通过模板匹配和变量来实现复杂的转换逻辑。 9. **XML在Web服务中的应用**:XML广泛应用于Web服务,如SOAP(简单对象...

    XML高级编程

    4. **XSLT(XSL Transformations)**:XSLT用于转换XML文档,将其转换成其他格式,如HTML、PDF或另一个XML文档。它使用模板和规则来定义转换过程。 5. **DOM(Document Object Model)与SAX(Simple API for XML)*...

    XML 高级编程(PDF2)

    10. **XML工具和技术**:了解XML编辑器、验证工具和调试器,如 Oxygen XML、XMLSpy和Visual Studio Code等,以及XML相关的库和框架,如Java的JAXB和.NET的XmlSerializer。 通过学习和掌握以上知识点,你可以成为一...

    _W3School pdf 版

    3. **XSL (Extensible Stylesheet Language)**:XSL是一种用于转换XML文档的样式表语言,可以将XML数据转换成HTML、PDF或其他格式。在W3School的XSL教程中,你会学习到XSLT(XSL Transformations)的基本概念,包括...

    stylekit:JavaScript替代品,用于使用XML和XSL创建动态文档

    使用XML和XSL创建动态文档。 由创建和维护。 该项目当前正在。 有关如何使用样式套件的更多信息,请参见LogicPull。 配置 Stylkit带有一个配置文件config.js 。 这可用于设置Apache FOP可执行文件的位置,以及输入...

    XML Editor/Validator/Designer with CAMV-开源

    CAM编辑器是领先的开源XML编辑器/验证/架构工具集,用于快速构建/部署XML / JSON / Hibernate / SQL数据/ Forms应用程序。 可视WYSIWYG数据设计,规则输入向导+拖放字典组件。 将从XML Schema / JSON导入,分析/重构...

Global site tag (gtag.js) - Google Analytics