2017-06-27 123 views
1

試圖通過在C#中使用以下代碼應用xslt轉換將XML轉換爲Json轉換。下面的錯誤可以讓任何人知道嗎? 代碼:xml to json using xslt

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(流); 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> 
+0

您的XML文檔或XSLT文檔是無效的XML。 – brijber

+2

您是否可以編輯您的問題以包含生成異常的XML和XSLT轉換示例 - 即[mcve]?如果我們可以自己運行代碼,則更有可能我們可以提供幫助。但是錯誤*有多個根元素。第2行,位置2. *表示您的一個XML文檔具有多個[根元素](https://en.wikipedia.org/wiki/Root_element)。一個XML文檔必須只有一個根元素。 – dbc

+0

@brijber我認爲它不是這樣的XML可以轉換爲HTML使用相同的XSLT文件和HTML文件是適當的。 – user3214322

回答

2

正如蒂姆指出,問題是,你的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); 

您的libray JsonConvert是否能夠處理文檔片段我不知道。

+0

謝謝@Honnen它的工作完美適合我 – user3214322