【问题标题】:How do I overcome XML case sensitive - insensitive如何克服 XML 区分大小写 - 不区分大小写
【发布时间】:2012-01-06 15:16:10
【问题描述】:

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

标准的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"、"carNameE" "CARNAME" ....?

谢谢

【问题讨论】:

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


    【解决方案1】:

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

    如果服务符合已发布的架构或 DTD,那么您可以在其中查找元素可能具有的属性。

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

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

    附录

    当需要carname 时,提供carName 与提供carmame、caarname、canrame、car_name 或car-name 的错误类型相同。考虑到错误输入的所有可能变化,不能合理地期望服务正确响应。变化非常多。当给定错误输入时,适当的行动方案是用信息丰富的错误消息进行响应,允许另一端纠正他们的错误。

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

    【讨论】:

    • 当然,我知道它应该有一个标准。但就我而言,我们有很多客户,我们无法确定他们是否根据模式创建 XML。而且我们还需要支持工作服务,无论是carName还是carname。
    • 为什么在输入错误时您的服务需要工作?更好的解决方案是返回信息性错误消息,以确保下次输入正确。有关详细信息,请参阅附录。
    【解决方案2】:

    假设您使用的是 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
    
    ...
    

    【讨论】:

      猜你喜欢
      • 2013-03-06
      • 2012-12-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      相关资源
      最近更新 更多