【问题标题】:Invalid character in the given encoding给定编码中的无效字符
【发布时间】:2011-07-26 12:02:55
【问题描述】:
XmlDocument oXmlDoc = new XmlDocument();

try
{
    oXmlDoc.Load(filePath);
}
catch (Exception ex)
{
    // Log Error Here
    try
    {
        Encoding enc = Encoding.GetEncoding("iso-8859-1");
        StreamReader sr = new StreamReader(filePath, enc);
        String response = sr.ReadToEnd();
        oXmlDoc.LoadXml(response);
    }
    catch (Exception innerException)
    {
        // Log Error Here
        return false;
    }
}

我从第三方获得了 xml 文件,其中还包括 xml 声明后的文档类型定义文件。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE SoccerMatchPlus SYSTEM "SoccerMatchPlus.dtd">
<SoccerMatchPlus matchid="33226">
<Booking id="13642055" time="47">
<Player id="370927">
<Name firstName="Lasse" initials="L" lastName="Nielsen">L Nielsen</Name>
</Player>
<Team id="26415" name="AæB" homeOrAway="Home"/>
</Booking>
</SoccerMatchPlus>

如果我使用给定编码中的无效字符解析文件。第 102 行,位置 56。如果我捕捉到异常并重试解析文件,那么我遇到了另一个问题,文件解析但是

我收到错误消息:找不到文件“C:\Windows\system32\SoccerMatchPlus.dtd”。

名为 SoccerMatchPlus.dtd 的文档类型定义文件由第三方添加到根元素之前。

在 Load 方法的情况下,解析器从 xml 文件也存在的位置加载文件。

我将 SoccerMatchPlus.dtd 放在 xml 文件所在的其他位置,我可以在运行时从指定位置加载 SoccerMatchPlus.dtd 文件吗,或者您能告诉我加载包含无效字符数据的 xml 文件的更好方法吗?

【问题讨论】:

  • 不清楚您为什么要尝试加载一个文件,该文件说它是 UTF-8 格式,就好像它是 ISO-8859-1 格式一样。
  • 因为当我将 ISO-8859-1 用于 oXmlDoc.LoadXml(response);解析文件成功但找不到 SoccerMatchPlus.dtd 文件的位置。
  • 听起来你没有正确地开始文件。您是否将其剪切并粘贴到文本编辑器或类似的东西中?我怀疑问题是当你从文件中加载它时,它能够找到相对于文件的 DTD - 所以你应该尝试让文件正确开始。
  • 当没有找到任何无效字符时 oXmlDoc.Load(filePath);有效并且不显示 [找不到文件'C:\Windows\system32\SoccerMatchPlus.dtd'] 的消息。如果它抛出异常,那么我尝试使用 oXmlDoc.LoadXml(response);该方法解析文件,但也给出了上述错误。我从 FTP 下载 XML 文件,但无法手动编辑文件。是否可以禁止解析器从我给定的文件路径中查找 DTD 文件,例如 (D:\XmlFiles\SoccerMatchPlus.dtd)?
  • 如果你从 FTP 下载文件,你确定你是以二进制模式下载的吗?如果在 XML 编辑器中加载文件,会发生什么?

标签: c# xmldocument


【解决方案1】:

使用XmlDocument 类的XmlResolver 属性禁用DTD 处理。

XmlDocument oXmlDoc = new XmlDocument();
oXmlDoc.XmlResolver = null;

【讨论】:

  • 它有效,现在我没有收到错误 [找不到文件'C:\Windows\system32\SoccerMatchPlus.dtd']。 XML 文件解析正确。
  • @Rais:但这并不能真正解决您开始使用的文件无效的问题。我会专注于解决这个潜在的问题。
  • @Rais 你也应该在调用Load之前尝试去除非法字符
  • @Adeel 如果我去掉可能是玩家名字的非法字符,那么它会给出错误的含义。例如玩家的全名是 [Moström Mattias],如果我将其替换为 [Mostrm Mattias] 则会给出错误的含义。
猜你喜欢
  • 2011-02-09
  • 2014-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多