我可以在Java中根据XSD片段验证XML文件吗
我可以根据xsd片段验证XML文件吗? 例如,我有一个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
<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) {}
}