我看到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复制和粘贴数据。我也没有设计这个,但我坚持维护它。 :)
答案 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;
}