doctype'是一个意外的令牌错误

时间:2013-12-30 01:48:07

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

最近,使用我的.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元素并在每个循环上显示<car>

我一直在尝试推荐人们安装最新的.NET Framework库,但这没有帮助。

导致此错误的原因是什么?如何修复?

修改

vb.net代码片段:

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>";
?>

1 个答案:

答案 0 :(得分:0)

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

<!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)