【问题标题】:XML validation - known and unknown attributes optional?XML 验证 - 已知和未知属性可选?
【发布时间】:2015-07-04 09:43:34
【问题描述】:

请告诉我这是否可能,如果可能的话。如何在 xsd 中声明,我的 xml 中的所有属性都是可选的。我不能声明所有属性,因为我的 xml 有不同数量的属性,包括已知的和未知的。

        schema = factory.newSchema(new StreamSource(xsdFileInputStream));
        Validator validator = schema.newValidator();
        validator.validate(new StreamSource(new StringReader(xmlString)));

谢谢。

【问题讨论】:

  • 让我看看我是否理解这一点,你不能修改 XSD 中的每个元素,但你想声明一些全局标志,它将所有元素变成可选的?
  • 是的,每个元素中的所有属性。
  • 但是你需要修改 XSD,你不能用验证器实例来做这个。
  • 是的,我想做。但我不知道怎么做。
  • w3.org/2001/XMLSchema">

标签: java xml validation xsd


【解决方案1】:

我找到了解决办法!

<xs:anyAttribute processContents="skip"/>

【讨论】:

    【解决方案2】:

    如果你可以修改XSD中的每一个元素,那么就这么简单:

    <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="unbounded" />
    

    这是您可以将属性声明为可选的方式:

    <xs:attribute name="lang" type="xs:string" use="optional"/>
    

    不确定我是否得到了正确的最终要求,您想自动执行此操作。 没有全局标志可以实现这一点,但您可以创建这样的脚本:

    • 用 Java 打开 XSD 文件
    • 逐行读取
    • 如果检测到&lt;xs:sequence&gt;,开启下面的修改算法
    • 在给定的行中查找元素或属性的声明
    • 如果有元素,追加出现规则
    • 属性默认是可选的,所以如果它们包含“必需”,则将其更改为可选
    • 当你找到&lt;/xs:sequence&gt;时,关闭修改算法
    • 重复直到没有更多行

    注意:对字符串进行此操作,一旦解析完成,它将替换文件的内容。

    【讨论】:

    • 我不能在根元素中声明“minOccurs="0" maxOccurs="unbounded"”。这是不允许的。
    • 这需要修改以仅解析 标签中的元素。
    • 怎么办?根元素具有属性。
    • 所以总是修改属性。不要触摸元素,除非它们在序列中。如果 XSD 是不应手动修改的黑盒,您将不得不编写一些这样的解析器。但老实说,我不明白你为什么不简单地手动更改所有元素和属性,
    【解决方案3】:

    XSD 1.1 允许你说

    <xs:schema defaultAttributes="defaultAttGroup"...
    
    <xs:attributeGroup name="defaultAttGroup">
      <xs:anyAttribute processContents="skip"/>
    </xs:attributeGroup>
    

    相当于为每个复杂类型添加一个属性通配符。

    【讨论】:

      猜你喜欢
      • 2018-09-07
      • 2017-11-03
      • 1970-01-01
      • 1970-01-01
      • 2019-08-25
      • 1970-01-01
      • 2019-05-03
      • 2019-03-13
      • 1970-01-01
      相关资源
      最近更新 更多