如何克服XML区分大小写 - 不敏感

时间:2012-01-06 15:16:11

标签: .net xml vb.net case-sensitive

我有一个读取xml文件的项目。它来自一个Web服务。但它有时会带来不同的属性。

标准的xml文件是这样的:

    <xml ....>
    <car carname="Opel">Opel
    </car>
    </xml> 

但是有时候网络服务可以发送一个像这样的xml文件:

    <xml ....>
    <car carName="Opel">Opel
    </car>
    </xml>

在代码背后;

    If carrierNode.Attributes("carname") IsNot Nothing Then
       CarrierLabel = carrierNode.Attributes("carname").Value 
    ...............

现在,当第二个类型的XML文件出现在我的代码中时,由于没有“carName”这样的属性,它会爆炸。 我如何支持carName的变体,如“CarName”,“carNamE”“CARNAME”......?

由于

2 个答案:

答案 0 :(得分:2)

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

如果服务符合已发布的模式或DTD,那么您可以查看该元素可能具有的属性。

如果没有已发布的架构,请询问提供商是否有架构。

如果根本没有使用架构,那么这种行为可能不是故意的,您应该向Web服务提供商提交错误。

附录

预计carname时,提供carName与提供carmamecaarnamecanramecar_namecar-name。考虑到错误输入的所有可能变化,不能合理地预期服务正确响应。变化非常多。在给出错误输入的情况下,适当的行动方针是回复信息错误消息,允许另一端纠正错误。

如果您明确希望支持某些已知的变体形式,例如carnamecarName,那么请针对您认为合理预期的变体执行此操作,并为任何内容提供适当且信息丰富的错误消息其他

答案 1 :(得分:1)

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

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

Dim attribute = (From a In carrierNode.Attributes() _
                 Where a.Name.ToLower() = "carname" _
                 Select a).FirstOrDefault()

If attribute IsNot Nothing Then
    CarrierLabel = attribute.Value

...