如何在XML中获取不区分大小写的元素

时间:2009-05-15 14:00:46

标签: xml xsd case-sensitive

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

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

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

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

有什么想法吗?

提前致谢!

7 个答案:

答案 0 :(得分:5)

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

即。 XML文件>解析XSD并更正>上传已批准的

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

很大程度上取决于问题的严重程度。如果您的XSD在不同情况下有类似标签,例如但是你接收到的话,你需要一个基于节点计数等的复杂解决方案。

如果您纯粹坚持使用针对仅包含小写标签的XSD的随机案例,那么您应该能够解析文件并将所有标签一次性转换为小写。这假设标签之间的内容是多个案例,您不能只转换完整的文档。

你如何做到这一点取决于你的情况的机制。显然,让客户错误检查他们自己的提交会更容易。如果这不实用,那么您需要在流程中确定一个机会窗口,这样您就可以在遇到错误之前将文件转换为正确的格式。

这里有很多方法可以讨论这个问题。它主要取决于你可以获得的技能或资金。

答案 1 :(得分:1)

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

如果您想输出节点名称并希望它是大写的,您可以这样做:

upper-case(local-name())

答案 2 :(得分:1)

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

这类似于允许用户在社会安全号码输入字段中输入特殊字符,仅仅因为用户更容易输入特殊字符(是的,这个例子很傻,想不到更好的字符! )

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

答案 3 :(得分:1)

理论上,您可以尝试破解XML Schema以验证错误的大写元素名称。

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

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

然后您可以将以下内容添加到XML Schema:

  <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区分大小写,那么他们可能没有与开始标记的情况相匹配的结束标记,但它仍然无法验证。

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

答案 4 :(得分:0)

XML通常是机器生成的。因此,这里你应该没有真正的问题<RANdOm />案例。

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

答案 5 :(得分:0)

上传后,浏览XML文件(通过DOM或SAX)并在验证之前修复外壳?

答案 6 :(得分:0)

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