.net 如何克服XML不区分大小写的缺点

.net 如何克服XML不区分大小写的缺点,.net,xml,vb.net,case-sensitive,.net,Xml,Vb.net,Case Sensitive,我有一个阅读xml文件的项目。它来自一个web服务。但它有时可能具有不同的属性 标准xml文件如下所示: <xml ....> <car carname="Opel">Opel </car> </xml> <xml ....> <car carName="Opel">Opel </car> </xml> 现在,当第二种类型的XML文

我有一个阅读xml文件的项目。它来自一个web服务。但它有时可能具有不同的属性

标准xml文件如下所示:

    <xml ....>
    <car carname="Opel">Opel
    </car>
    </xml> 
    <xml ....>
    <car carName="Opel">Opel
    </car>
    </xml>
现在,当第二种类型的XML文件出现在我的代码中时,它爆炸了,因为没有带有“carName”的属性。 我如何支持像“carName”、“carName”、“carName”这样的carName变体


谢谢

假设您使用的是Visual Basic.Net和XLinq:

我不确定这是不是正确的Visual Basic.Net-您可能需要在几个地方修复它


假设您使用的是Visual Basic.Net和XLinq:

我不确定这是不是正确的Visual Basic.Net-您可能需要在几个地方修复它


您不需要支持所有案例变体。XML区分大小写,这意味着
carName
carName
是两个不同的属性。不能仅仅因为两个属性具有相似的名称就安全地假设它们是相同的

如果服务符合已发布的模式或DTD,那么您可以查看其中的内容以了解元素可能具有哪些属性

如果没有发布的模式,那么询问提供者是否有

如果根本没有使用模式,那么这种行为很可能不是故意的,您应该向web服务提供商提交一个bug

补遗 当需要
carname
时,提供
carname
与提供
carame
caarname
canrame
car\u name
car name
是同一种错误。考虑到错误输入的所有可能变化,不能合理地期望服务正确响应。变化非常多。当给出错误的输入时,适当的措施是以信息性错误消息响应,允许另一端纠正错误


如果您明确希望支持某些已知的变体,如
carname
carname
,那么请对您认为合理的变体进行支持,并为其他任何变体提供适当且信息丰富的错误消息。

您不需要支持所有案例变体。XML区分大小写,这意味着
carName
carName
是两个不同的属性。不能仅仅因为两个属性具有相似的名称就安全地假设它们是相同的

如果服务符合已发布的模式或DTD,那么您可以查看其中的内容以了解元素可能具有哪些属性

如果没有发布的模式,那么询问提供者是否有

如果根本没有使用模式,那么这种行为很可能不是故意的,您应该向web服务提供商提交一个bug

补遗 当需要
carname
时,提供
carname
与提供
carame
caarname
canrame
car\u name
car name
是同一种错误。考虑到错误输入的所有可能变化,不能合理地期望服务正确响应。变化非常多。当给出错误的输入时,适当的措施是以信息性错误消息响应,允许另一端纠正错误


如果您明确地希望支持某些已知的变体,例如
carname
carname
,那么请对您认为合理的变体进行支持,并为其他任何内容提供适当且信息丰富的错误消息。

当然,我知道它应该有一个标准。但在我的例子中,我们有很多客户,我们无法确定他们是否根据模式创建XML。我们还需要支持工作服务,无论它是carName还是carName。为什么在输入错误时,您的服务需要工作?更好的解决方案是返回信息性错误消息,以确保下次输入正确。更多细节见附录。当然,我知道它应该有一个标准。但在我的例子中,我们有很多客户,我们无法确定他们是否根据模式创建XML。我们还需要支持工作服务,无论它是carName还是carName。为什么在输入错误时,您的服务需要工作?更好的解决方案是返回信息性错误消息,以确保下次输入正确。详见附录。
    If carrierNode.Attributes("carname") IsNot Nothing Then
       CarrierLabel = carrierNode.Attributes("carname").Value 
    ...............
Dim attribute = (From a In carrierNode.Attributes() _
                 Where a.Name.ToLower() = "carname" _
                 Select a).FirstOrDefault()

If attribute IsNot Nothing Then
    CarrierLabel = attribute.Value

...