.net XmlDocument加载与右引号加载XML

.net XmlDocument加载与右引号加载XML,.net,xml,.net,Xml,我看到.NET2.0中XmlDocument Load()和LoadXml()的工作方式有所不同。给出下面的XML文档(注意右引号的使用,ascii代码146): 我知道代码很差,但它只是为了演示问题。如果字符串“xmlDoc”不是合法的xml文档,那么我试图让它失败 我无法控制发送给我的XML的内容。我只是通过web服务接收并使用它。显然,人们称之为复制和粘贴Word文档中的数据。我也没有设计这个,但我一直在维护它。:) 区别在于编码。从文件加载时,将应用utf-8解码,并且您的代码146在您

我看到.NET2.0中XmlDocument Load()和LoadXml()的工作方式有所不同。给出下面的XML文档(注意右引号的使用,ascii代码146):

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


我无法控制发送给我的XML的内容。我只是通过web服务接收并使用它。显然,人们称之为复制和粘贴Word文档中的数据。我也没有设计这个,但我一直在维护它。:)

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

如果有人感兴趣,我们会找到另一种方法“验证”字符串,至少检查是否有正确的字符。我们以前也尝试过类似的方法,但是没有在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;
}

听起来像是一个或一个擒纵机构问题。请显示您正在使用的代码,以及当它不工作时您收到的完整异常。实际上ASCII是七位(最大128位),因此146不能是字符ASCII值。它是8位编码的值。在Unicode中,其代码为U+2019。仅此一点就表明您尚未将文档保存在UTF-8中,但prolog声称是这样。这会导致无效字符,从而导致格式错误的XML。在使用LoadXml时,有没有办法强制编码?或者在加载后根据编码对其进行验证?谢谢。您必须理解.Net字符串和原始二进制数据之间的区别。字符串没有编码(从用户的角度来看),因此您的问题没有意义。如果文件已加载,则无需验证。我理解你的观点,并意识到我的问题措词不当。我的问题仍然存在,尽管在web服务中将XML文档作为字符串发送给我,并且要求我检查并强制执行该字符串,就像它是原始文档一样。有什么办法吗?也许这是不可能的,但我还没有准备好放弃。再次感谢。如果您有一些原始二进制数据,您可以将其解释为ascii字符。有时,这种误用的“字符串”会被发送到web服务。在这种情况下,您必须将.Net字符串转换回原始二进制数据。之后,您将能够读取它,因为它将是一个原始文件。在我看来,这是背道而驰的做法,但这种看法对你没有多大帮助为了提供帮助,我必须看到更多的细节,了解更多的内部信息。
[WebMethod]
public bool SubmitData(string xmlDoc)
{
   try
   {
      XmlDocument doc = new XmlDocument();
      doc.LoadXml(xmlDoc);
   }
   catch
   {
      return false;
   }

   return true;
}
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;
}