XML命名空间名称的最小长度?

时间:2013-08-06 18:27:09

标签: c# xml uri xml-namespaces

当我注意到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)位于堆栈跟踪上,可能导致此问题。我找到了一些反编译的源here,这导致我走上Uri.TryCreate的路径,大概C#期望一个有效的URI方案?

感谢您的时间: - )。

1 个答案:

答案 0 :(得分:1)

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


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

RFC3986, section 3.1 Scheme

  

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

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

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

 <prefix:ElementName xmlns:prefix="scheme:path" />