1

XML の検証で遊んでいると、C# が長さ 2 文字未満のコロンの前にテキストを含む名前空間プレフィックス名をスローすることに気付きました。

<?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 では、1 文字の名前空間プレフィックスが許可されています。1 文字方式は登録されていないため、慣習的な制限か、1 文字方式名を禁止する他の文書が存在する可能性があります。


名前空間 URI の URI スキーム (誤って「名前空間プレフィックス」と名付けたもの) は、少なくとも 2 文字の長さである必要があります。

RFC3986、セクション 3.1 スキーム

...スキーム名は、文字で始まり、その後に文字、数字、プラス ("+")、ピリオド (".")、またはハイフン ("-") の任意の組み合わせが続く一連の文字で構成されます。

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

注: 名前空間プレフィックスは、次のサンプルの「プレフィックス」部分です。詳細については、XMLの名前空間を参照してください。

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