我可以在Java中根据XSD片段验证XML文件吗

我可以在Java中根据XSD片段验证XML文件吗,java,xml,jaxb,xmlbeans,Java,Xml,Jaxb,Xmlbeans,我可以根据xsd片段验证XML文件吗? 例如,我有一个XML,如: <tag1> <xx>...</xx> </tag1> ... 还有一个XSD,比如: <xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:e

我可以根据xsd片段验证XML文件吗? 例如,我有一个XML,如:

<tag1>
    <xx>...</xx>
</tag1>

...
还有一个XSD,比如:

<xsd:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="envTeste">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element name="tag" minOccurs="1" maxOccurs="1">
          <xsd:simpleType>
            <xsd:restriction base="xsd:int">
              <xsd:totalDigits value="1" />
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
        <xsd:element name="tag1" minOccurs="1" maxOccurs="1">
          <xsd:simpleType>
            <xsd:restriction base="xsd:string">
              <xsd:pattern value="^\d{1,15}$"/>
            </xsd:restriction>
          </xsd:simpleType>
        </xsd:element>
............................

............................
我只想使用片段“name=tag1”来验证我的xml。 有可能吗?使用JAXB


非常感谢。

不,这在JAXB中是不可能的,而且我认为,鉴于当前的XML模式和所示的XML数据,任何其他工具都无法进行这种部分验证

首先,您显示的XML与XML模式的部分不一致。所以,它无论如何都不会验证

第二,假设匹配XML模式代码和XML数据,可以考虑将XML数据封装到<代码> 元素中,但是由于缺少代码< > /Code >元素,验证将不成功。 但是您可以编写一个(正确且匹配的!)元素

作为顶级XML模式元素,并从
中引用它。然后,由
组成的XML文档可以通过传递给解组器的XML模式文件来解组


另一种选择是(相当简单的)XSLT,它可以从“有趣的”元素生成XML模式,并将它们作为顶级元素安装—前提是模式不是太复杂。不确定,但可能是可行的。

不,这在JAXB中是不可能的,而且我认为在当前XML模式和XML数据的情况下,没有任何其他工具能够进行这样的部分验证,如图所示

首先,您显示的XML与XML模式的部分不一致。所以,它无论如何都不会验证

第二,假设匹配XML模式代码和XML数据,可以考虑将XML数据封装到<代码> 元素中,但是由于缺少代码< > /Code >元素,验证将不成功。 但是您可以编写一个(正确且匹配的!)元素

作为顶级XML模式元素,并从
中引用它。然后,由
组成的XML文档可以通过传递给解组器的XML模式文件来解组


另一种选择是(相当简单的)XSLT,它可以从“有趣的”元素生成XML模式,并将它们作为顶级元素安装—前提是模式不是太复杂。不确定,但可能是可行的。

不,这在JAXB中是不可能的,而且我认为在当前XML模式和XML数据的情况下,没有任何其他工具能够进行这样的部分验证,如图所示

首先,您显示的XML与XML模式的部分不一致。所以,它无论如何都不会验证

第二,假设匹配XML模式代码和XML数据,可以考虑将XML数据封装到<代码> 元素中,但是由于缺少代码< > /Code >元素,验证将不成功。 但是您可以编写一个(正确且匹配的!)元素

作为顶级XML模式元素,并从
中引用它。然后,由
组成的XML文档可以通过传递给解组器的XML模式文件来解组


另一种选择是(相当简单的)XSLT,它可以从“有趣的”元素生成XML模式,并将它们作为顶级元素安装—前提是模式不是太复杂。不确定,但可能是可行的。

不,这在JAXB中是不可能的,而且我认为在当前XML模式和XML数据的情况下,没有任何其他工具能够进行这样的部分验证,如图所示

首先,您显示的XML与XML模式的部分不一致。所以,它无论如何都不会验证

第二,假设匹配XML模式代码和XML数据,可以考虑将XML数据封装到<代码> 元素中,但是由于缺少代码< > /Code >元素,验证将不成功。 但是您可以编写一个(正确且匹配的!)元素

作为顶级XML模式元素,并从
中引用它。然后,由
组成的XML文档可以通过传递给解组器的XML模式文件来解组


另一种选择是(相当简单的)XSLT,它可以从“有趣的”元素生成XML模式,并将它们作为顶级元素安装—前提是模式不是太复杂。不确定,但可能是可行的。

因为我第一次误读了你的帖子,我删除了我的答案并创建了一个新的:

如果原始架构包含要用于验证的子树,则可以通过XPath表达式(如f.e.
/@*):name='tag1'
/@name='tag1'
)找到子树的顶部节点(如果不使用命名空间定义)

Node node = (Node)xpath.evaluate(xpathExpression, originSchemaDocument, XPathConstants.NODE);
基本上,您希望以某种方式调用以生成可用于验证的模式。因此,最方便的方法可能是创建一个

此外,还可以使用一个新的模式来生成该源,您可以使用该模式将以前提取的子树复制到新的“模式”中。此外,您还必须手动或通过从源模式复制向正在创建的文档添加模式定义,否则将无法获得有效的模式


我自己还没有尝试过这种方法,但根据我过去使用这些方法的经验,我认为这是可行的。

因为我第一次误读了你的帖子,所以我删除了我的答案并创建了一个新答案:

如果原始架构包含要用于验证的子树,则可以通过XPath表达式(如f.e.
/@*):name='tag1'
/@name='tag1'
)找到子树的顶部节点(如果不使用命名空间定义)

Node node = (Node)xpath.evaluate(xpathExpression, originSchemaDocument, XPathConstants.NODE);
基本上,您希望以某种方式调用以生成您可以使用的模式
<target name="sat-beans">
    <mkdir  dir="${xbean-gen}"/>
    <mkdir  dir="${xbean-classes}"/>
    <taskdef name="xmlbean" classname="${xbean-class-name}" classpath="${xbean-class-path}"/>
    <xmlbean schema="./xsd/CfeTeste_0006.xsd" classgendir="${xbean-classes}" 
            srcgendir="${xbean-gen}"  
            destfile="${xbean-dest-file}" 
            classpath="${xbean-class-path}" />
</target>
public void validate(String xml) {

    try {

        List<XmlValidationError> errors = new ArrayList<XmlValidationError>();
        EnvTesteDocument envTesteDocument = EnvTesteDocument.Factory.parse(xml);

        XmlOptions voptions = new XmlOptions();
        voptions.setValidateOnSet();
        voptions.setErrorListener(errors);

        if (envTesteDocument.getEnvTeste().getCFe().validate(voptions)) {
            return;
        }

        for (XmlValidationError error : errors) {
            ...
        }


    } catch (XMLInvalidException e) {}

}