当我注意到 C#在长度小于 2 个字符的冒号之前抛出带有文本的命名空间前缀名称时,我一直在尝试验证一些 XML。
<?xml version="1.0" encoding="utf-16"?><Example xmlns="a:example" />
在 C# 中无效,但
<?xml version="1.0" encoding="utf-16"?><Example xmlns="a1:example" />
不是?
这是 XML 标准的一部分,还是我在 C# 中看到了一些奇怪的东西?
这是一些示例代码。
// Create fake XML.
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.AppendChild(xmlDocument.CreateElement("Example", "a:example"));
//xmlDocument.AppendChild(xmlDocument.CreateElement("Example", "a1:example"));
// Display the XML to the user.
using (StringWriter stringWriter = new StringWriter())
{
using (XmlWriter xmlTextWriter = XmlWriter.Create(stringWriter)) { xmlDocument.WriteTo(xmlTextWriter); }
Console.WriteLine(stringWriter.GetStringBuilder().ToString());
}
// Infer schema.
using (Stream stream = new MemoryStream())
{
xmlDocument.Save(stream);
stream.Position = 0;
new XmlSchemaInference().InferSchema(XmlReader.Create(stream));
}
// If we got this far then we are happy.
Console.WriteLine("We are happy");
这将生成 XmlSchemaException:
The Namespace 'a:example' is an invalid URI.
带有 FormatException 的 InnerException:
The string 'a:example' is not a valid Uri value.
更改为注释行会导致代码正常工作。
XmlConvert.ToUri(String s) 位于堆栈跟踪中,可能会导致此问题。我在这里找到了一些反编译的源代码,这使我走上了通往Uri.TryCreate的道路,大概 C# 需要一个有效的 URI 方案?
谢谢你的时间 :-)。