- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
RFC2141 提到:
Examples of lexical equivalence
The following URN comparisons highlight the lexical equivalence
definitions:1- URN:foo:a123,456
2- urn:foo:a123,456
3- urn:FOO:a123,456
4- urn:foo:A123,456
5- urn:foo:a123%2C456
6- URN:FOO:a123%2c456URNs 1, 2, and 3 are all lexically equivalent.
随后的 RFC8141 保留了这种等价性:
2.1. Namespace Identifier (NID)
NIDs are case insensitive (e.g., "ISBN" and "isbn" are equivalent).
我可以在 .NET 框架中轻松找到的最接近 URN 的表示是 URI class 。然而,它似乎并没有完全遵守 RFC 对等价的定义:
[TestMethod]
public void TestEquivalentUrnsAreBroken()
{
Assert.AreEqual(
new Uri("URN:foo:a123,456"),
new Uri("urn:foo:a123,456"));
Assert.AreEqual(
new Uri("urn:foo:a123,456"),
new Uri("urn:FOO:a123,456"));
}
在上面的代码示例中,第一个断言按预期工作,而第二个断言失败。
有什么合理的方法可以让 URI 类遵守等价定义吗?我应该改用其他类(class)吗?
请注意,我找到了 URN class ,但文档中提到不应直接使用它。
最佳答案
Uri 类不支持开箱即用的 urn:
方案的特定解析器。也许可以理解,因为即使 NID 的比较规则指定它不区分大小写,根据 RFC 8141 ,比较两个 NSS 的规则将取决于特定 namespace 定义的规则。
对于一种快速而肮脏的方法,您可以尝试使用 Uri.Compare() 方法。对于两个 URI 相等的情况,它将返回零,否则返回非零。
var u1 = new Uri("URN:foo:a123,456");
var u2 = new Uri("urn:foo:a123,456");
var u3 = new Uri("urn:FOO:a123,456");
var u4 = new Uri("urn:nope:a123,456");
Console.WriteLine(Uri.Compare(u1, u2, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.OrdinalIgnoreCase)); // 0
Console.WriteLine(Uri.Compare(u1, u3, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.OrdinalIgnoreCase)); // 0
Console.WriteLine(Uri.Compare(u2, u3, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.OrdinalIgnoreCase)); // 0
Console.WriteLine(Uri.Compare(u3, u4, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.OrdinalIgnoreCase)); // -8
对于更冒险的方法,您可以按照以下方式进行操作。这需要仔细思考才能正确实现。此代码不应按原样使用,而是作为起点。
using System;
using System.Text.RegularExpressions;
public class Program
{
public static void Main()
{
var u1 = new Urn("URN:foo:a123,456");
var u2 = new Urn("urn:foo:a123,456");
var u3 = new Urn("urn:foo:a123,456");
var u4 = new Urn("urn:FOO:a123,456");
var u5 = new Urn("urn:not-this-one:a123,456");
Console.WriteLine(u1 == u2); // True
Console.WriteLine(u3 == u4); // True
Console.WriteLine(u4 == u5); // False
}
public class Urn : Uri
{
public const string UrnScheme = "urn";
private const RegexOptions UrnRegexOptions = RegexOptions.Singleline | RegexOptions.CultureInvariant;
private static Regex UrnRegex = new Regex("^urn:(?<NID>[a-z|A-Z][a-z|A-Z|-]{0,30}[a-z|A-Z]):(?<NSS>.*)$", UrnRegexOptions);
public string NID { get; }
public string NSS { get; }
public Urn(string s) : base(s, UriKind.Absolute)
{
if (this.Scheme != UrnScheme) throw new FormatException($"URN scheme must be '{UrnScheme}'.");
var match = UrnRegex.Match(this.AbsoluteUri);
if (!match.Success) throw new FormatException("URN's NID is invalid.");
NID = match.Groups["NID"].Value;
NSS = match.Groups["NSS"].Value;
}
public override bool Equals(object other)
{
if (ReferenceEquals(other, this)) return true;
return
other is Urn u &&
string.Equals(NID, u.NID, StringComparison.InvariantCultureIgnoreCase) &&
string.Equals(NSS, u.NSS, StringComparison.Ordinal);
}
public override int GetHashCode() => base.GetHashCode();
public static bool operator == (Urn u1, Urn u2)
{
if (ReferenceEquals(u1, u2)) return true;
if (ReferenceEquals(u1, null) || ReferenceEquals(u2, null)) return false;
return u1.Equals(u2);
}
public static bool operator != (Urn u1, Urn u2)
{
if (ReferenceEquals(u1, u2)) return false;
if (ReferenceEquals(u1, null) || ReferenceEquals(u2, null)) return true;
return !u1.Equals(u2);
}
}
}
关于c# - 我如何在 .NET 中表示 URN(统一资源名称)以便 Equals 按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51285047/
ugcPosts 端点可用于请求组织最近使用以下 URL 模板创建的帖子列表https://api.linkedin.com/v2/ugcPosts?q=authors&authors=List(ur
验证字符串是否有效的最简单方法是什么 URN ? 编辑 使用 URI 不是正确的解决方案! URI 可以包含各种 URN 不能包含的内容,比如 & 最佳答案 如果你只需要验证它,你可以使用正则表达式。
我有一个引用基于瓮的位置的 XML 模式文件。有没有什么方法可以将其解析为 url,或者有什么方法可以实际读取它所引用的文件。 最佳答案 这个问题不是解释“URN 解析”的好地方......我们可以
是否有任何可用的分层 URN 方案可以使用 URL 或域名作为“前缀”? 最好的毕业生 最佳答案 所有 URN 命名空间标识符 (NID) 都在此处注册:http://www.iana.org/ass
我有点理解 URN 用于为资源提供唯一且与位置无关的名称。然而,我看不到它们的用处以及它们的工作原理: a) 为了让 URN 真正独一无二,必须有一些中央机构(类似于域名机构),我们可以在其中注册 U
MIME 类型的官方 URN 是否存在? Mozilla Firefox 和其他应用程序使用诸如“urn:mimetype:text/plain”或“urn:mimetype:handler:text
在要处理的输入 XML 中,我有一个 URN UUID 作为文件标识符: urn:供应商:处理器:uuid:0269803d-50c4-46b0-9f50-60ef7fe3e22b 我需要检查此 UU
我需要根据时间动态生成图形的名称。 我很坚强,有些人认为 select ?g where { bind(concat("") as ?g) } 本来可以解决问题的,但是使用 Stardog 我
我在 Umbraco 4.8 下开发。 我正在尝试从我的 XSLT 访问一个类以从中检索某些内容。该类名为 UmbracoHelper。我在 XSLT 的顶部添加了以下内容: xmlns:Umbrac
“瓮:”代表什么? 我正在玩 ServiceStack Redis 示例。这似乎是一种命名约定,数据库中的许多键都以“urn:”开头。 通过调用 somePoco.CreateUrn(); --> "
对于“hello world”类型的 xml 文档: Cheaper by the Dozen 1568491379 您可以为自定义目的任意动态定义骨灰盒吗? 最佳答案 简而言之,是的
我正在寻找或构建一个 URN ( Universal Resource Name ) 解析器,它将为给定的 URN 返回 0 个或多个 URI。 例如:urn:fooid:6e8bc430-9c3a-
我使用 Lets Encrypt 并得到错误: urn:acme:error:unauthorized::客户端缺乏足够的授权::解析 key 授权文件时出错: key 授权无效: token 格式错
我读过很多关于的文章URI s, 网址 s 和 URN s,但我不明白实际例子中的差异。 你能举几个的例子吗? URI 和 网址 ? 我想 http://stack.com/first/index.h
在我的 AngularJS/Ionic 应用程序中,我正在编写一个指令,其元素的自定义参数包含 JSON 架构 URN。问题在于 AngularJS 尝试将此 URN 计算为表达式。 错误: Err
我正在使用 Azure,我注意到它为每个资源组和资源创建了一个如下所示的 ID。 对于资源组 /subscriptions//resourceGroups/ 对于资源,它看起来像这样 /subscri
我正在努力扩展当前的记录器解决方案,我希望包含更多信息,而不仅仅是类、行号、日志级别、日期等。我还想捕获主机名、软件的制造商生成日志消息、软件产品名称、软件版本和代码库。 我的搜索除了用户代理字符串之
我正在使用 Azure,我注意到它为每个资源组和资源创建了一个如下所示的 ID。 对于资源组 /subscriptions//resourceGroups/ 对于资源,它看起来像这样 /subscri
就在 2002 年,IETF 还在 RFC 3406 中进行了推荐。我们应该使用x-我们不想注册的 URN 命名空间的前缀,例如urn:x-acme:foobar .现在 IETF 已弃用 x- RF
我想为一个关于发布的 RDF/XML 语句建模(在命名空间中,比如“myns”)。我知道该出版物在给定的 URN 下是已知的。在 RDF 中引用该 URN 的正确方法是什么?我可以想到许多不同的方法来
我是一名优秀的程序员,十分优秀!