我有一个读取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”......?
由于
答案 0 :(得分:2)
您无需支持所有案例变体。 XML区分大小写,这意味着carName
和carname
是两个不同的属性。你不能安全地假设只是因为两个属性具有相似的名称,它们是相同的。
如果服务符合已发布的模式或DTD,那么您可以查看该元素可能具有的属性。
如果没有已发布的架构,请询问提供商是否有架构。
如果根本没有使用架构,那么这种行为可能不是故意的,您应该向Web服务提供商提交错误。
预计carname
时,提供carName
与提供carmame
,caarname
,canrame
,car_name
或car-name
。考虑到错误输入的所有可能变化,不能合理地预期服务正确响应。变化非常多。在给出错误输入的情况下,适当的行动方针是回复信息错误消息,允许另一端纠正错误。
如果您明确希望支持某些已知的变体形式,例如carname
和carName
,那么请针对您认为合理预期的变体执行此操作,并为任何内容提供适当且信息丰富的错误消息其他
答案 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
...