You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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语法规范:

  1. XSLT文档必须以<xsl:stylesheet>或<xsl:transform>作为根节点,而你直接用<html>作为根节点,解析器在第1行就无法识别合法的XSLT结构,因此抛出根级别数据无效的错误。
  2. 另外,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.30 04:07:32