10

据我所知,XML 元素类型名称和属性名称是区分大小写的。

有没有办法或任何技巧来获取不区分大小写的元素?

澄清:已通过 XSD 定义了一种语法,用于某些客户端上传数据。用户 - 内容生成器 - 正在使用不同的工具创建 XML 文件,但其中许多人使用纯文本编辑器或其他工具。有时,当这些人试图上传他们的文件时,他们会遇到不兼容错误。尽管标签区分大小写总是很清楚,但它们混合使用小写和大写标签是一个常见错误。

我可以访问定义此语法的 XSD 文件,并且可以更改它。问题是如何避免这种容易出错的小写/大写标签问题。

任何想法?

提前致谢!

4

7 回答 7

5

如果我正确理解您的问题,则只能通过第 3 方解析工具在创建和上传之间纠正案例错误。

即 XML 文件 > 针对 XSD 解析并更正 > 上传批准

您可以在运行时通过为您的客户端开发一个容器应用程序来创建他们的 XML 文件来执行此操作。或者,您可以在服务器端编写一个应用程序来获取上传的文件并检查语法。无论哪种方式,您都必须做出决定,然后做一些工作!

很大程度上取决于问题的规模。如果您在 XSD 中的不同情况下有类似的标签,例如,但您正在接收,那么您将需要一个基于节点计数等的复杂解决方案。

如果您完全被客户端使用随机大小写来对抗仅包含小写标签的 XSD,那么您应该能够解析文件并将所有标签一次性转换为小写。这是假设标签之间的内容是多写的,您不能只转换整个文档。

你如何做到这一点取决于你的情况。显然,让客户对自己的提交进行错误检查会更容易。如果这不切实际,那么您需要在此过程中确定一个机会之窗,以便在遇到错误之前将文件转换为正确的格式。

有太多的方法可以在这里讨论。这主要取决于您可用的技能或资金。

于 2009-05-15T14:38:20.840 回答
2

简单的解决方案是在您从用户加载 xml 时将所有标签/属性发送到小写,然后才通过为所有小写标签/属性设计的 xsd 检查它

于 2014-08-17T03:42:24.053 回答
1

XPath/ Xslt 处理器区分大小写。如果您指定了错误的大小写,他们将无法选择节点/属性。

如果您想输出节点名称并希望它是大写的,您可以执行以下操作:

upper-case(local-name())
于 2009-05-15T14:11:37.347 回答
1

正如@Melkisadek 所说,XSD 验证是有目的的。如果您允许用户上传带有无效 XML 的文件,那么当访问这些文件中的数据时,您的应用程序必然会失败。此外,让 XSD 验证输入 XML 模式的整个目的都被打破了。如果您愿意放弃整个模式验证功能,那么您需要使用 XSLT 将所有标签转换为您想要的大写或小写(请参阅@Rashmi 的答案)。

这类似于允许用户在社会安全号码输入字段中输入特殊字符,只是因为用户更愿意输入特殊字符(是的,这个例子很愚蠢,想不出更好的例子!)

因此,在我看来,解决方案在于保持模式验证原样,但为用户提供一种在上传之前验证模式的方法。例如,如果这是 Web 应用程序,您可以在页面上提供一个按钮,该按钮使用 Javascript 来根据您的架构验证文件。或者,仅在上传文件时在服务器上进行验证。在这两种情况下,提供适当的反馈,例如错误实体所在的行号、字符位置以及标记错误的原因。

于 2009-05-15T17:00:52.243 回答
1

理论上,您可以尝试破解 XML Schema 来验证不正确大写的元素名称。

这可以通过使用XML Schema 中的替换组机制来完成。例如,如果您的架构已定义:

  <xsd:element name="foobar" type="xsd:string"/>

那么您可以将以下内容添加到 XML 模式中:

  <xsd:element name="Foobar" type="xsd:string" substitutionGroup="foobar"/>
  <xsd:element name="FooBar" type="xsd:string" substitutionGroup="foobar"/>
  <xsd:element name="fooBar" type="xsd:string" substitutionGroup="foobar"/>
  <xsd:element name="FOOBAR" type="xsd:string" substitutionGroup="foobar"/>

等等

尝试并预测他们可能犯的错误。对于每个元素,可能有 2^n 种可能的情况组合,其中 n 是名称的长度(假设名称的每个字符都是一个字母)。

在实践中,这太麻烦了,只会拖延问题而不是解决问题,而且很可能行不通。如果用户没有意识到 XML 是区分大小写的,那么他们可能没有与开始标记的大小写匹配的结束标记,并且仍然无法验证。

正如其他人所说,要么预处理提交的输入以修复案例,要么让用户在提交之前生成正确的输入。

于 2009-12-15T13:12:56.900 回答
0

XML 通常是机器生成的。<RANdOm />因此,在这里宽度大小写应该没有真正的问题。

如果真正的问题是两个不同的系统正在生成两种不同类型的标签(<Widget />vs. <widget />),我想您可以简单地在 XSD 中定义这两种情况。

于 2009-05-15T14:10:25.993 回答
0

上传后,遍历 XML 文件(通过 DOM 或 SAX)并在验证之前修复大小写?

于 2009-05-20T17:07:31.850 回答