【问题标题】:How to ensure an xml entity has a valid name如何确保 xml 实体具有有效的名称
【发布时间】:2011-01-06 16:35:33
【问题描述】:

我有一个应用程序,它根据来自我无法控制的来源的一些数据生成一堆 xml。基本上,我将这些数据转换为 xml 文档,以便通过 rss 提要提供服务。我可能会得到像

这样的数据
2_br=1
3_br=0

我正在把它变成下面的xml

<2_br>1</2_br>
<3_br>0</3_br>

显然 xml 标签不能以数字开头。我在任何地方都找不到有效字符的列表。它存在于某个地方吗?我基本上只是要添加前缀和无效的起始字符,或者用_ 替换内联无效字符。

这并不难,但基本上我只是找不到 xml 标记名称的无效字符列表。

【问题讨论】:

    标签: c# .net xml xml-validation


    【解决方案1】:

    这个怎么样:Extensible Markup Language (XML) 1.0 (Fifth Edition)

    NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]

    【讨论】:

    • 多么奇怪和危险......“:”字符在技术上作为名称字符是有效的。我从来不知道。
    • ":" 是允许的,因为在 XML 推荐完成时尚未引入命名空间。因此,一个 XML 文档的元素的名称包含多个“:”字符可以是格式正确且有效,但它不会是命名空间格式正确,因为它不'不符合 XML 命名空间建议。因此,XML 解析器可能会拒绝此类文档,因为(除了格式良好之外)解析器可能需要命名空间一致性。
    • 另请注意,允许的名称字符列表在 XML 1.0 建议的第 4 版中有所不同,不允许某些当前允许的字符。一些较旧的解析器可能仅符合第 4 版(或更早版本)并且可能拒绝在第 5 版有效的文档。 XML 1.0 的当前字符列表符合 XML 1.1 建议。
    • 另请注意,您不能像在 .NET 正则表达式中那样使用该名称生成规则。 .NET 字符串使用 UTF-16 编码,U+10000 大于 16 位。对上面显示的最后一个字符类进行编码的正确方法是使用 UTF-16 代理对,将所示范围内的字符编码为 2 个 16 位值。您应该在 .NET 中使用以下正则表达式:([\uD800-\uDB7F][\uDC00-\uDFFF])。此模式将匹配 U+10000U+EFFFF 之间的所有 UTF 字符。
    • .Net 和 java 字符串未编码,它们包含恰好为 16 位宽或 10000(十六进制)的原始字符。
    【解决方案2】:
    XmlConvert.IsNCNameChar() 
    

    XmlConvert.IsStartNCNameChar()
    

    可用于验证 XML 标记名称:

    char[] validTagNameChars = pDesiredTagName.Where(ch => XmlConvert.IsNCNameChar(ch)).ToArray();
    string validTagName = new string (validTagNameChars);
    if (validTagName == "" || !XmlConvert.IsStartNCNameChar(validTagName[0]))
      validTagName = "_" + validTagName;
    

    【讨论】:

      猜你喜欢
      • 2021-12-02
      • 2022-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-19
      • 1970-01-01
      相关资源
      最近更新 更多