C# XML转HTML时出现XmlException:根级别数据无效(第1行第1位)问题求助
解决XmlException: Data at the root level is invalid. Line 1, position 1错误
你在使用C#将XML转换为HTML时遇到了XmlException: Data at the root level is invalid. Line 1, position 1,错误发生在加载XSLT的环节。先看一下你提供的原始内容:
原始XML内容
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE task "sdlGeneralTask.dtd"[]> <task id="1234" xml:lang="en"> <title id="12345">For Validation Test</title> <taskbody cid="345"> <steps id="1263"> <step cid="324"> <cmd>Test operation for validation.</cmd> </step> </steps> </taskbody> </task>
原始XSLT内容
<?xml version="1.0" encoding="iso-8859-1"?> <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> <body style="font-family:Arial;font-size:12pt;background-color:#FFFFFF"> <xsl:for-each select="task"> <div style="background-color:teal;color:white;padding:4px"> <span style="font-weight:bold"> <xsl:value-of select="node"/> </span> </div> </xsl:for-each> </body> </html>
原始C#代码
public static string TransformXMLToHTML(string inputXml, string xsltString) { XslCompiledTransform transform = new XslCompiledTransform(); using (XmlReader reader = XmlReader.Create(new StringReader(xsltString))) { transform.Load(reader); //错误发生在此处 } StringWriter results = new StringWriter(); using (XmlReader reader = XmlReader.Create(new StringReader(inputXml))) { transform.Transform(reader, null, results); } return results.ToString(); }
问题根源分析
这个错误的核心原因是你的XSLT结构不符合XSLT语法规范:
- XSLT文档必须以
<xsl:stylesheet>或<xsl:transform>作为根节点,而你直接用<html>作为根节点,解析器在第1行就无法识别合法的XSLT结构,因此抛出根级别数据无效的错误。 - 另外,XSLT中的
<xsl:value-of select="node"/>是错误的,node不是你XML中存在的节点路径,应该指向具体的节点(比如title)。
修复方案
1. 修正XSLT结构
调整XSLT为标准结构,使用<xsl:stylesheet>作为根节点,并修正节点选择逻辑:
<?xml version="1.0" encoding="iso-8859-1"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns="http://www.w3.org/1999/xhtml"> <!-- 匹配XML文档根,作为转换入口 --> <xsl:template match="/"> <html> <body style="font-family:Arial;font-size:12pt;background-color:#FFFFFF"> <!-- 遍历task节点 --> <xsl:for-each select="task"> <!-- 渲染标题 --> <div style="background-color:teal;color:white;padding:4px"> <span style="font-weight:bold"> <xsl:value-of select="title"/> </span> </div> <!-- 渲染步骤内容 --> <div style="padding:10px;margin-top:8px"> <xsl:for-each select="taskbody/steps/step"> <p><xsl:value-of select="cmd"/></p> </xsl:for-each> </div> </xsl:for-each> </body> </html> </xsl:template> </xsl:stylesheet>
这里的关键修改:
- 用
<xsl:stylesheet>作为根节点,符合XSLT规范 - 添加
<xsl:template match="/">作为转换的入口模板 - 将
select="node"改为select="title",正确获取XML中的标题内容 - 增加了步骤内容的渲染逻辑,让转换后的HTML更完整
2. 优化C#代码
你的C#代码逻辑基本没问题,但需要处理XML中的DOCTYPE声明,添加DtdProcessing.Parse允许解析DTD,避免加载XML时出错:
public static string TransformXMLToHTML(string inputXml, string xsltString) { XslCompiledTransform transform = new XslCompiledTransform(); // 配置XSLT读取器,允许解析DTD XmlReaderSettings xsltSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse }; using (XmlReader reader = XmlReader.Create(new StringReader(xsltString), xsltSettings)) { transform.Load(reader); } StringWriter results = new StringWriter(); // 配置XML读取器,允许解析DTD XmlReaderSettings xmlSettings = new XmlReaderSettings { DtdProcessing = DtdProcessing.Parse }; using (XmlReader reader = XmlReader.Create(new StringReader(inputXml), xmlSettings)) { transform.Transform(reader, null, results); } return results.ToString(); }
测试结果
修复后运行代码,转换后的HTML会正确显示标题和步骤内容,之前的XmlException错误也会消失。
内容的提问来源于stack exchange,提问作者riya
相关产品推荐
相关产品推荐

