Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java XSD—未绑定的任意(未知)元素数,但定义了序列中的最后一个元素_Java_Xml_Xsd_Schema - Fatal编程技术网

Java XSD—未绑定的任意(未知)元素数,但定义了序列中的最后一个元素

Java XSD—未绑定的任意(未知)元素数,但定义了序列中的最后一个元素,java,xml,xsd,schema,Java,Xml,Xsd,Schema,是否可以使用一个或多个XSD来验证以下xml结构 <container> <unkownA /> <unkownB /> <unkownC /> ... <data /> </container> ... 按照这些规则 未知元素的数量是无限的 至少有一个未知元素 最后一个元素是数据 数据只出现一次 根据提供的规则验证数据 xml中的所有元素都具有相同的名称空间(“”),我们无法更

是否可以使用一个或多个XSD来验证以下xml结构

<container>
    <unkownA />
    <unkownB />
    <unkownC />
    ...
    <data />
</container>

...
按照这些规则

  • 未知元素的数量是无限的
  • 至少有一个未知元素
  • 最后一个元素是数据
  • 数据只出现一次
  • 根据提供的规则验证数据 xml中的所有元素都具有相同的名称空间(“”),我们无法更改。 我们很可能也无法更改元素的顺序,尽管我知道这可能是最简单的解决方案。 一般来说,更改xml是不可行的,因为它是由我们不控制的外部系统生成的

    我试过这样的东西

    <xs:sequence>
       <xs:any minOccurs="1" maxOccurs="unbounded" processContents="lax" />
       <xs:element ref="data" minOccurs="1" />
    </xs:sequence>
    
    
    
    这当然是含糊不清的,违反了“独特粒子属性”

    我在这里还了解了第二个名称空间的使用 但是,由于我们无法更改xml,这似乎不是一个解决方案,或者我显然无法正确理解它

    由于我们使用Java来处理xml/xsd,xsd驻留在类路径中,因此xsd中的xs:import可能会出现问题

    如果答案是“在这些约束条件下,xsd无法实现这一点”,我可以接受


    有什么想法吗?

    如果您至少知道您希望在容器类型中出现的类型的名称,那么您可以将它们命名为xs:anyType。但是您需要知道可能的类型名列表,否则模式定义它们的意义是什么


    更新:我不正确,您可以创建容器
    ,但是这将阻止您指定容器中必须有
    元素

    如果您至少知道您希望在容器类型中出现的类型的名称,那么您可以将它们命名为xs:anyType。但是您需要知道可能的类型名列表,否则模式定义它们的意义是什么


    更新:我不正确,您可以创建容器
    ,但是这将阻止您指定容器中必须有
    元素

    您尝试的模式在XSD 1.1中有效-请使用最新版本的Saxon或Xerces再试一次。

    您尝试的模式在XSD 1.1中有效-请使用最新版本的Saxon或Xerces再试一次。

    最后成功的是什么,即使我不满意:

    javax.xml.validation.SchemaFactory schemaFactory = SchemaFactory
            .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    
    schemaFactory
        .setFeature(
            "http://apache.org/xml/features/validation/schema-full-checking",
            false);
    
    这似乎禁用了模式本身的验证。 xml的验证工作如预期和上面所述。
    是的,我知道:禁用默认激活的安全/健全功能可能不是一个好主意。但是直到我知道没有时间找到更好的方法。

    什么最终奏效了,即使它不能让我快乐:

    javax.xml.validation.SchemaFactory schemaFactory = SchemaFactory
            .newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
    
    schemaFactory
        .setFeature(
            "http://apache.org/xml/features/validation/schema-full-checking",
            false);
    
    这似乎禁用了模式本身的验证。 xml的验证工作如预期和上面所述。
    是的,我知道:禁用默认激活的安全/健全功能可能不是一个好主意。但是直到我知道没有时间找到更好的方法。

    您有“未知”数据类型的模式吗?@home:在验证的这一点上没有/在验证数据的模式中,此外,它们根本不需要验证您是否有“未知”数据类型的架构?@home:在验证的这一点上没有/在验证数据的架构中,它们也根本不需要验证架构在1.0中也是有效的。我花了一些时间整合xerces 2.11.0 beta版,但我不仅得到了“唯一粒子属性”错误,我还得到了一个错误,这似乎是由于XSD 1.1实现的beta状态造成的:
    cvc elt.1.a:找不到元素“doc”的声明
    -doc的声明显然在那里,并且与以前的xml api实现配合良好目前我无法让Saxon在我们的项目设置中工作,当我这样做的时候,我会报告并批准答案状态,如果它有效的话。因为Saxon的家庭版似乎不包含XSD 1.1的实现,只有pro和enterprise版本包含。因此,我必须获得评估许可证才能进行进一步的测试。这可能需要一段时间,因为项目现在正在进行中。模式在1.0中也有效。我花了一些时间整合xerces 2.11.0 beta版,但我不仅得到了“唯一粒子属性”错误,我还得到了一个错误,这似乎是由于XSD 1.1实现的beta状态造成的:
    cvc elt.1.a:找不到元素“doc”的声明
    -doc的声明显然在那里,并且与以前的xml api实现配合良好目前我无法让Saxon在我们的项目设置中工作,当我这样做的时候,我会报告并批准答案状态,如果它有效的话。因为Saxon的家庭版似乎不包含XSD 1.1的实现,只有pro和enterprise版本包含。因此,我必须获得评估许可证才能进行进一步的测试。这可能需要一段时间,因为项目现在正在进行。我们尝试使用“通配符”的原因是我们不知道或不想知道容器中可能包含哪些元素,除了数据之外,我的原始答案是不正确的。我已经编辑过了。在您的情况下,需要将容器设置为xs:any类型。这意味着验证器将忽略您放在其中的任何内容。我们尝试使用“通配符”的原因是我们不知道或不想知道容器中可能包含哪些元素,除了担心的数据之外,我的原始答案是不正确的。我已经编辑过了。在您的情况下,需要将容器设置为xs:any类型。这意味着验证器将忽略您在其中输入的任何内容。