从XML转换到JSON的方法有多种, 不过都要依赖第三方的库来实现转化,不过有了eBay提供的xml-2-json.xlst模板,你会发现转换原来很轻松.
xml-2-json.xslt的代码大致如下(稍做了点改动):
<?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:value-of select="text()"/>"
</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(@*) > 0)">
"<xsl:value-of select="local-name()"/>": <xsl:value-of select="$elementData"/>
</xsl:if>
<xsl:if test="count(@*) > 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>
从上面的代码可以看出,只要给出相应的XML在应用此XLST样式就可以实现转化了。
不过为了方便,还是封装一层,以便我们能更好地在.NET下完成任务:
首先,是一个通用的转换方法,它可以读出流,然后应用XSLT样式:
private static string XML2JSon(Stream rd,int type)
...{
XmlDocument doc = new XmlDocument();
rd.Position=0;
doc.Load(rd);
XmlElement root = doc.DocumentElement;
XmlNodeList nl;
if(type == 0)
nl = root.SelectNodes("//Table1");
else
nl = root.ChildNodes;
XmlDocument srcdoc = new XmlDocument();
string temp =null;
foreach(XmlNode xn in nl)
...{
if(type==0)
temp += xn.InnerXml;
else
temp += xn.OuterXml;
}
temp = "<result>" + temp + "</result>";
srcdoc.InnerXml = temp;
XPathNavigator nav = srcdoc.CreateNavigator();
XslTransform xt = new XslTransform();
string path = ConfigurationSettings.AppSettings["ServerPath"];
xt.Load(path + "css/xml-2-json.xsl");
Stream w = new MemoryStream();
XmlTextWriter wr = new XmlTextWriter(w,Encoding.GetEncoding("UTF-8"));
xt.Transform(nav,null,w,null);
w.Position = 0;
StreamReader tr = new StreamReader(w);
string str = tr.ReadToEnd();
w.Close();
tr.Close();
return str;
}
然后定义三个重载方法,来负责转换或序列化对象生成XML:
转换DataSet
public static string Convert(DataSet ds)
...{
MemoryStream ms = new MemoryStream();
XmlTextWriter tw = new XmlTextWriter(ms,Encoding.UTF8);
ds.WriteXml(ms);
string str = XML2JSon(ms,0);
分享到:
相关推荐
利用XSLT转换XML.pdf利用XSLT转换XML.pdf利用XSLT转换XML.pdf利用XSLT转换XML.pdf
xslt模板转换例子,里面的例子能够很好学习
经过XSLT处理器测试: libxslt 1.1 Xalan-Java 2.7.1 撒克逊人的Java 9.1.0.8
java中使用xslt转换xml成为另一个xml 将一个xml文件按照你写的xslt的格式转换成符合你要求的xml文档
winform 使用XSLT来转换XML源码! 很值得下载看看!资源免费,大家分享!!
java_xslt转换xml
本json库包支持由json数据自动转换成xml报文数据, 对应用的配置化开发起到重要作用,在企业的移动开发中,通过与xslt的结合,开发工作更便捷。
XML内容管理应用程序的增长刺激了对XSLT和Xpath技能的要求.本入门教程提供了XSLT处理模型的...XSLT 是一种用于将 XML 文档转换为 XHTML 文档或其他 XML 文档的语言。 XPath 是一种用于在 XML 文档中进行导航的语言。
基于XSLT的XML文档转换技术基于XSLT的XML文档转换技术基于XSLT的XML文档转换技术基于XSLT的XML文档转换技术基于XSLT的XML文档转换技术
这是个很好的,用xslt转换,修改xml的好例子!
您可以通过在转换之前使用JSON2XML来简单地预处理数据,然后将其通过管道传递到XSLT 2.0样式表中。 这样,您的样式表就可以与XSLT 3.0向前兼容,因为XML表示形式是完全相同的。 无效字符 JSON输入可能包含在XML输出...
使用XSLT将XML文档转换成HTML文档.
本篇文章是对在.net中使用XSLT转换xml文档的示例进行了详细的分析介绍,需要的朋友参考下
ASP处理XSLT转换XML的实现 使用ASP处理XSLT转换XML比较简单,思路如下:创建一个XSLTemplate的对象,再创建一个XMLDOM对 象,然后在家Xml文件和XSLT文件,最后使用方法transform即可,包含到类里面,具体代码...
XML笔记+XSLT中文入门 XML笔记+XSLT中文入门XML笔记+XSLT中文入门 XML笔记+XSLT中文入门
主要内容包括:XML语法和格式良好的XML,XML命名空间,利用DTD和XML Schema进行XML验证,使用SOAP和Web服务,以及运用ADO.NET进行数据库访问等。本书还用两个案例分析来展示XML的具体应用。 本书适合于有一定的...
xml的关键技术。xpath的常用属性。以及xslt与xpath入门转换xml文档与数据
xml2json xslt xml2json xslt会将XML转换为JSON格式。 这篇有更多详细信息。运行测试在命令行中,运行npm以安装依赖项,然后运行测试。 npm installnpm test
本文介绍利用Excel软件生成格式,提取和精简之后制作成xslt文件,将xml导入,以xslt为模板,生成新的Excel文件的过程。