【问题标题】:doctype' is an unexpected token errordoctype' 是一个意外的令牌错误
【发布时间】:2014-01-16 21:47:37
【问题描述】:

最近使用我的 .NET 应用程序的用户在运行时遇到了一些关于此错误消息的问题:doctype' is an unexpected token. the expected token is 'doctype'

有趣的是,数百人中只有少数人遇到了这个问题。

这就是我的 XML 文件的样子:

<?xml version='1.0'?>
<build>
    <row>
        <car>Type</car>
        <enum>12</enum>
    </row>
    <row>
        <car>Type1</car>
        <enum>14</enum>
    </row>
    <row>
        <car>Type2</car>
        <enum>15</enum>
    </row>
</build>

我在 .NET 应用程序中实际做的是循环遍历 XML 元素并在每个循环上显示 &lt;car&gt;

我一直在尝试推荐人们安装最新的 .NET Framework 库,但这无济于事。

是什么导致了这个错误,如何解决?

编辑

vb.net sn-p 代码:

Dim client As WebClient = New WebClient()
client.Encoding = System.Text.Encoding.UTF8
Dim data As String = client.DownloadString("http://mywebsite.com/code.php")

While client.IsBusy
    Threading.Thread.Sleep(100)
End While

Dim doc As New System.Xml.XmlDocument
doc.LoadXml(data)

For Each row As System.Xml.XmlElement In list
    'proceed the element(s)...
Next

^ code.php ,负责输出 XML 字符串:

<?php
header('Content-Type: text/xml; charset=utf-8;');
ini_set('default_mimetype', "text/xml");
ini_set('default_charset', "utf-8");

echo "<?xml version='1.0'?>
<build>";
foreach ($_engine as $line)
{
    echo '<row><car>' . htmlspecialchars($line->car) . '</car><enum>' . (int)$line->enum . '</enum></date></row>';
}
echo "</build>";
?>

【问题讨论】:

  • 我建议发布相关的 sn-p 代码,因为 XML 格式正确,不会出现问题。
  • 你必须给使用一种方法来重现问题。否则我认为没有人可以帮助你。
  • @Marcinjuraszek 老实说,我自己什至无法重现这个问题。正如我所说,数百名用户中只有少数人遇到此问题。我一直在尝试重现这一点,但失败了......
  • 顺便说一句。我正在通过 PHP 生成 XML 代码,我将很快编辑我的问题并添加更多代码。
  • 更新了代码。添加了 PHP 和 vb.net 代码的 sn-ps。

标签: .net xml vb.net xml-parsing doctype


【解决方案1】:

我可以通过在&lt;?xml version='1.0'?&gt; 之后添加以下行来重现此错误:

<!doctype html public "-//w3c//dtd xhtml 1.1//en" "http://www.w3.org/tr/xhtml11/dtd/xhtml11.dtd">

这会抛出一个错误:

'doctype' 是一个意外的标记。预期的令牌是“DOCTYPE”

请注意,预期的令牌是大写的DOCTYPE。我相信返回的 XML 文件以某种方式包含此元素。您可以尝试像这样删除根元素之前和之后的所有内容:

Const startTag As String = "<build>"
Const endTag As String = "</build>"

Dim startIndex As Integer = data.IndexOf(startTag, 0, data.Length, StringComparison.OrdinalIgnoreCase)
Dim endIndex As Integer = If((startIndex > -1), data.LastIndexOf(endTag, (data.Length - 1), data.Length), -1)

If ((startIndex > -1) AndAlso (endIndex > -1)) Then
    data = ("<?xml version='1.0'?>" & Environment.NewLine & data.Substring(startIndex, ((endIndex - startIndex) + endTag.Length)))
End If

然后加载XmlDocument:

Dim doc As New System.Xml.XmlDocument
doc.LoadXml(data)

【讨论】:

    猜你喜欢
    • 2014-06-04
    • 2019-02-09
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    相关资源
    最近更新 更多