1

当我注意到 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 方案?

谢谢你的时间 :-)。

4

1 回答 1

1

编辑:请注意,此答案可能不正确 - RFC3986 ABNF 的第 3.1 节允许使用单字母命名空间前缀。没有注册一个字母的方案,因此它要么是习惯性的限制,要么可能存在其他一些禁止单字母方案名称的文件。


命名空间 Uri 的 Uri 方案(您错误地命名为“命名空间前缀”)应该至少有 2 个字符长:

RFC3986,第 3.1 节方案

...方案名称由一系列字符组成,以字母开头,后跟字母、数字、加号(“+”)、句点(“.”)或连字符(“-”)的任意组合。

 scheme      = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." )

注意:命名空间前缀是以下示例的“前缀”部分。有关详细信息,请参阅XML中的命名空间。

 <prefix:ElementName xmlns:prefix="scheme:path" />
于 2013-08-06T18:37:15.747 回答