Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用自定义XSLT将XML转换为JSON会松开大括号_C#_Xml_Json_Xslt - Fatal编程技术网

C# 使用自定义XSLT将XML转换为JSON会松开大括号

C# 使用自定义XSLT将XML转换为JSON会松开大括号,c#,xml,json,xslt,C#,Xml,Json,Xslt,我有一个.NET库,它使用XSLT文件将啤酒xml文件转换为web应用程序的json XSLT文件看起来很像这样: <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> <xsl:output method="text" omit-xml-declaration="yes" /> <xsl:template match="RECIPES"> { {

我有一个.NET库,它使用XSLT文件将啤酒xml文件转换为web应用程序的json

XSLT文件看起来很像这样:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" omit-xml-declaration="yes" />
<xsl:template match="RECIPES">
{
    {
      "description": {
      "name": "<xsl:value-of select="NAME"/>",
      "style": "<xsl:value-of select="STYLE/NAME"/>",
      ...

现在,问题是输出中缺少大括号和空格。而且它过去是有用的。从源代码管理的历史来看,我看不出最近有什么明显的变化。关于如何解决这个问题有什么建议吗?

我建议首先将其转换为xml,并将其存储到变量中,然后应用标准/通用模板将其转换为JSON。我将使用XSLT2.0或3.0实现这一点,并实现
xml-to-json()

这是我对上述示例的解决方案:


{}
"" :
"
"
"":""
{ "" :[] }
{}
,

XSLT通常是生成JSON的错误工具。它不能可靠地做到这一点,它不知道JSON是如何工作的。这是错误的方法,应该使用正确的JSON序列化程序。网有不少,挑一个吧。考虑一下这个方法,它会让你不止一个头痛:@托马拉克不确定为什么你认为XSLT是一个糟糕的选择吗?OP希望将XML转换为字符串,尽管是格式化字符串。为什么XSLT不是一个很好的选择?@legostrmtroopr,如果没有其他选择(可能没有其他选择),在XSLT中对字符串进行正确的JSON转义将非常不方便,因为它需要在大型值映射(包括大多数非ASCII unicode点)上使用单到多字符表示。虽然我倾向于尽可能地让XSLT受益于怀疑,但我认为Tomolak是正确的。@AndersNygaard,这是正确的。听我的建议。XSLT不是实现这一点的合适工具。它无法进行适当的字符转义,并且很容易在没有让您注意到的情况下生成语法错误的JSON,而且很难解决这个问题。使用LINQtoXML在.NET中生成所需的对象图,并将该图直接序列化为JSON。这将使工作安全、正确、快速地完成,而且很可能只需要更少的代码行。@Legostrmtropr OP不想将XML转换为字符串。他希望将其转换为JSON,而JSON不是字符串。JSON是一种序列化形式的对象图,具有专门且相当复杂的语法规则,就像XML本身一样。JSON输出没有内置到XSLT中,因此它不能可靠地遵守JSON的形式语义。在这一点上,它变成了一个打不中的游戏,生成正确JSON的XSL样式表将非常复杂(至少比OP的尝试复杂得多)。另外:已经有了针对.NET的JSON序列化程序,为什么还要构建另一个次等的呢?这个答案引出了一个带有错误注释的错误问题。请考虑作出贡献
using(var writer = new StringWriter()){
     _xsltCompiler.Transform(_document, null, writer);
     json = writer.ToString();
}