带右引号的XmlDocument Load与LoadXml

时间:2011-05-31 19:22:34

标签: .net xml

我看到XmlDocument Load()和LoadXml()在.NET 2.0中的工作方式有所不同。鉴于下面的XML文档(注意使用正确的引用,ascii代码146):

<?xml version="1.0" encoding="utf-8"?>
<nodes>
  <node>Some Data ’</node>
</nodes>

为什么在以字符串形式传入时它会在LoadXml()中正常加载,但如果作为文档传入Load()则会失败。 I.E.和其他XML编辑器也不会加载和显示该文件。

简化代码示例:

[WebMethod]
public bool SubmitData(string xmlDoc)
{
   try
   {
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(xmlDoc);
   }
   catch
   {
      return false;
   }

   return true;
}

我知道代码很差,但它只是为了证明问题。如果字符串“xmlDoc”不是合法的xml文档,那么我试图让它失败。

我无法控制发送给我的XML内容。我刚接收它并通过Web服务使用它。显然,调用它的人正在从Word Doc复制和粘贴数据。我也没有设计这个,但我坚持维护它。 :)

2 个答案:

答案 0 :(得分:5)

区别在于编码。从文件加载时,将应用utf-8解码,并且您的代码146在您的情况下可能无效utf-8。 LoadXml忽略编码,因为.Net字符串不需要解码。因此,你的特殊角色是一个有效的角色,一切都很好。

答案 1 :(得分:1)

如果有人感兴趣,我们发现了另一种“验证”字符串的方法,至少要检查正确的字符。我们之前尝试过类似的东西,但没有在UTF8Encoding上使用正确的构造函数,因此没有得到我们希望的结果。这不一定会检查XML的正确性,但它至少会验证发送给我们的字符。

string xmlDoc = ""; // whatever has been passed in.
try
{
   System.Text.UTF8Encoding utf8 = new System.Text.UTF8Encoding(false, true);
   byte[] bytes = new System.Text.UnicodeEncoding().GetBytes(xmlDoc);
   utf8.GetChars(bytes);
}
catch (Exception ex)
{
   Console.WriteLine(ex.Message);
   return false;
}