【问题标题】:xml to json using xslt使用 xslt 将 xml 转换为 json
【发布时间】:2023-03-30 02:40:01
【问题描述】:

我正在尝试通过在 C# 中使用以下代码应用 xslt 转换来将 XML 转换为 Json 转换。出现以下错误有人可以在下面建议我吗? 代码:

 Li = p.GetRegisterEntry();
        var std = Li.Where(s => s.Id == id).FirstOrDefault();
        string xml = std.contentxml.Value;
        doc.LoadXml(xml);            
        string XSLT = std.TemplateXSLT.Value;
        Xslt.LoadXml(XSLT);            
        XslCompiledTransform xslt = new XslCompiledTransform();
        xslt.Load(Xslt.CreateNavigator());           
        // Transform our Xml-ified JSON
        var outputDocument = new XmlDocument();
        var stream = new MemoryStream();
        xslt.Transform(doc, null, stream);
        var sr = new StreamReader(stream);
        var myStr = sr.ReadToEnd();
        stream.Position = 0;
        outputDocument.Load(stream);
        // Convert back to JSON
        string jsonText = JsonConvert.SerializeXmlNode(outputDocument);

在 outputDocument.Load(stream); 处收到以下错误; System.Xml.dll 中出现“System.Xml.XmlException”类型的异常,但未在用户代码中处理 附加信息:有多个根元素。第 2 行,位置 2。

谁能帮我破解这个?

这是我的 XML 和 XSTL 文件 XML:

   <NewDataSet>
      <RegisterEntry type="CM2" desc="Request to Change Name, Address and /or Singapore Address for Service for Agent, Applicant/Proprietor and/or other interested Parties">
        <EventDate>23/09/2051</EventDate>
        <DataItems>
          <LodgementDate>26/08/2022</LodgementDate>
          <DecisionDate>21/12/2031</DecisionDate>
          <Particulars>
            <Particular>
              <TransactionType>Test Data</TransactionType>
              <Details>Test Data</Details>
            </Particular>
          </Particulars>
        </DataItems>
      </RegisterEntry>
    </NewDataSet>

XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
  <xsl:output method="html" />
  <xsl:template match="RegisterEntry">
    <p>      Test Data Parties<xsl:value-of select="DataItems/TransactionType" /></p>
    <div id="content">
      <table>
        <tr>
          <th valign="top" align="left">            Lodgement Date          </th>
          <td>
            <xsl:value-of select="DataItems/LodgementDate" />
          </td>
        </tr>
        <tr>
          <th valign="top" align="left">            Decision Date          </th>
          <td>
            <xsl:value-of select="DataItems/DecisionDate" />
          </td>
        </tr>
        <xsl:for-each select="DataItems/Particulars/Particular">
          <tr>
            <th valign="top" align="left" style="width:50%">    Test Data <xsl:value-of select="TransactionType" /></th>
            <td>
              <xsl:value-of select="Details" />
            </td>
          </tr>
        </xsl:for-each>
      </table>
    </div>
  </xsl:template>
</xsl:stylesheet>

【问题讨论】:

  • 您的 XML 文档或 XSLT 文档是无效的 XML。
  • 您能否edit 您的问题包括生成异常的 XML 和 XSLT 转换示例 - 即 minimal reproducible example?如果我们可以自己运行代码,我们就更有可能提供帮助。但是错误有多个根元素。第 2 行,位置 2。 表示您的一个 XML 文档有多个 root element。一个 XML 文档必须只有一个根元素。
  • @brijber 我认为不是这样,xml 可以使用相同的 XSLT 文件转换为 HTML,并且 html 文件是正确的。
  • @user3214322 - 几乎可以肯定您正在生成的输出文档没有单个根元素,但要确定您应该真正编辑您的问题以显示您的输入 XML 和您的 XSLT。谢谢。
  • @TimC 按要求添加了文件,请帮助我

标签: c# json xml xslt


【解决方案1】:

正如 Tim 所指出的,问题在于您的 XSLT 没有创建格式良好的 XML 文档,您可以使用 XmlDocument 加载,而只是一个片段。因此,如果您需要带有结果的XmlNode,您可以使用不同的方法,例如

XmlDocument resultDoc = new XmlDocument();
XmlDocumentFragment resultFrag = resultDoc.CreateDocumentFragment();

using (XmlWriter xw = resultFrag.CreateNavigator().AppendChild())
{
  xslt.Transform(doc, null, xw);
  xw.Close();
}

string jsonText = JsonConvert.SerializeXmlNode(resultFrag);

您的库 JsonConvert 是否能够处理我不知道的文档片段。

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2019-12-28
    • 1970-01-01
    • 2018-12-04
    • 2012-10-12
    • 2021-07-22
    相关资源
    最近更新 更多